/* storitev.jsx, service page template
   Reads document.body.dataset.service to choose content. */

/*
 * renderHL — pretvori ==besedilo== v <em>besedilo</em> (oranžen highlight).
 * Uporablja se z dangerouslySetInnerHTML za heading polja iz CMS.
 * Podpira tudi direktne <em> tage za backward compatibility.
 */
function renderHL(text) {
  if (!text) return '';
  return String(text).replace(/==(.+?)==/g, '<em>$1</em>');
}

/* Page language (set on <body data-lang>) — used to pick the right content. */
const _slang = (document.body && document.body.dataset && document.body.dataset.lang) || "SI";
/* Pick a language variant from a {SI,EN,DE} map, falling back to SI. */
function L(map) { return (map && (map[_slang] != null ? map[_slang] : map.SI)); }

/* ── UI label translations (section eyebrows, headings, buttons) ── */
const SRV_T = {
  scopeEyebrow:   { SI: "Obseg",            EN: "Scope",            DE: "Umfang" },
  refEyebrow:     { SI: "Reference",        EN: "References",       DE: "Referenzen" },
  refH2:          { SI: "Zaupali so nam.",  EN: "They trust us.",   DE: "Sie vertrauen uns." },
  faqEyebrow:     { SI: "Pogosta vprašanja", EN: "FAQ",             DE: "Häufige Fragen" },
  faqH2:          { SI: "Vprašanja & odgovori", EN: "Questions & answers", DE: "Fragen & Antworten" },
  certLabel:      { SI: "CERTIFIKAT",       EN: "CERTIFICATE",      DE: "ZERTIFIKAT" },
  contentEyebrow: { SI: "VSEBINA",          EN: "CONTENT",          DE: "INHALT" },
  articlesH2:     { SI: ["Zapisi in projekti","s tega področja."], EN: ["Articles and projects","from this field."], DE: ["Beiträge und Projekte","aus diesem Bereich."] },
  readSuffix:     { SI: "branja",           EN: "read",             DE: "Lesezeit" },
  allNews:        { SI: "Vse novice",       EN: "All news",         DE: "Alle Neuigkeiten" },
  allNewsHref:    { SI: "/novice",          EN: "/en/news",         DE: "/de/neuigkeiten" },
  articleHref:    { SI: "/novice/",         EN: "/en/news/",        DE: "/de/neuigkeiten/" },
  infraEyebrow:   { SI: "Infrastruktura",   EN: "Infrastructure",   DE: "Infrastruktur" },
  infraH2:        { SI: ["Vsak sistem. ","En partner."], EN: ["Every system. ","One partner."], DE: ["Jedes System. ","Ein Partner."] },
  benefits:       { SI: "PREDNOSTI",        EN: "BENEFITS",         DE: "VORTEILE" },
  serviceEyebrow: { SI: "Storitev",         EN: "Service",          DE: "Leistung" },
  auditH2:        { SI: ["Data Center ","Audit."], EN: ["Data Center ","Audit."], DE: ["Data Center ","Audit."] },
  auditBody:      { SI: "Med našimi inženirji je strokovnjak, ki je bil prvi v Sloveniji akreditiran pri Uptime Institute kot Accredited Tier Specialist. Na tej osnovi ponujamo neodvisen pregled vašega podatkovnega centra z oceno stanja in prioritiziranimi priporočili.",
                    EN: "Among our engineers is a specialist who was the first in Slovenia to be accredited by the Uptime Institute as an Accredited Tier Specialist. On this basis we offer an independent review of your data center with a condition assessment and prioritised recommendations.",
                    DE: "Unter unseren Ingenieuren ist ein Spezialist, der als erster in Slowenien vom Uptime Institute als Accredited Tier Specialist akkreditiert wurde. Auf dieser Grundlage bieten wir eine unabhängige Begutachtung Ihres Rechenzentrums mit Zustandsanalyse und priorisierten Empfehlungen." },
  auditCta:       { SI: "Zahtevaj audit",   EN: "Request an audit", DE: "Audit anfragen" },
  anatomyEyebrow: { SI: "Anatomija",        EN: "Anatomy",          DE: "Anatomie" },
  componentsH2:   { SI: ["Komponente ","sistema."], EN: ["System ","components."], DE: ["System-","komponenten."] },
  nesiteEyebrow:  { SI: "Prednosti",        EN: "Advantages",       DE: "Vorteile" },
  specialH2:      { SI: ["Prednosti ","sistema."], EN: ["System ","advantages."], DE: ["Vorteile des ","Systems."] },
  specialSub:     { SI: "Štiri razlogi, zakaj investitorji izberejo dvignjeni pod.",
                    EN: "Four reasons investors choose a raised floor.",
                    DE: "Vier Gründe, warum Investoren einen Doppelboden wählen." },
  dcFloorEyebrow: { SI: "Podatkovni centri", EN: "Data Centers",    DE: "Rechenzentren" },
  dcFloorH2:      { SI: ["Pod za ","kritično infrastrukturo."], EN: ["A floor for ","critical infrastructure."], DE: ["Ein Boden für ","kritische Infrastruktur."] },
  dcFloorLede:    { SI: "Dvignjeni pod za podatkovne centre je visoko-zmogljiv sistem, ki se prilagaja konstantni evoluciji strežniških sob. Modularen in prilagodljiv, bistveno zmanjša stroške upravljanja in vzdrževanja.",
                    EN: "A raised floor for data centers is a high-performance system that adapts to the constant evolution of server rooms. Modular and flexible, it significantly reduces management and maintenance costs.",
                    DE: "Ein Doppelboden für Rechenzentren ist ein Hochleistungssystem, das sich der ständigen Entwicklung von Serverräumen anpasst. Modular und flexibel reduziert er Verwaltungs- und Wartungskosten erheblich." },
  ctaH2:          { SI: ["Imate projekt?","Slišimo se."], EN: ["Have a project?","Let's talk."], DE: ["Haben Sie ein Projekt?","Sprechen wir."] },
  ctaContact:     { SI: "Kontaktirajte nas", EN: "Contact us",      DE: "Kontaktieren Sie uns" },
  ctaRefs:        { SI: "Poglej reference",  EN: "View references", DE: "Referenzen ansehen" },
  videoCaption:   { SI: "Tetris Floor · Predstavitveni video", EN: "Tetris Floor · Promo video", DE: "Tetris Floor · Vorstellungsvideo" },
  playVideo:      { SI: "Predvajaj video",  EN: "Play video",       DE: "Video abspielen" },
  systemEyebrow:  { SI: "Sistem",           EN: "System",           DE: "System" },
  floorVisualH2:  { SI: ["Pod, ki nosi ","infrastrukturo."], EN: ["A floor that carries ","infrastructure."], DE: ["Ein Boden, der ","Infrastruktur trägt."] },
  floorVisualSub: { SI: "Modularna konstrukcija NESITE Tetris Floor omogoča popolno integracijo kabelskih tras, hladilnih kanalov in napajanja pod površino poda.",
                    EN: "The modular NESITE Tetris Floor construction enables full integration of cable routes, cooling channels and power supply beneath the floor surface.",
                    DE: "Die modulare NESITE-Tetris-Floor-Konstruktion ermöglicht die vollständige Integration von Kabeltrassen, Kühlkanälen und Stromversorgung unter der Bodenoberfläche." },
  partnerSlo:     { SI: "Ekskluzivni partner za Slovenijo", EN: "Exclusive partner for Slovenia", DE: "Exklusivpartner für Slowenien" },
  pin1Title:      { SI: "Kalcijev sulfat paneli", EN: "Calcium sulphate panels", DE: "Calciumsulfat-Panele" },
  pin1Desc:       { SI: "Razred A1 · DIN EN · 12 kN/m²", EN: "Class A1 · DIN EN · 12 kN/m²", DE: "Klasse A1 · DIN EN · 12 kN/m²" },
  pin2Title:      { SI: "Jekleni pedestali", EN: "Steel pedestals", DE: "Stahl-Stützfüße" },
  pin2Desc:       { SI: "Nastavljiva višina 150–600 mm", EN: "Adjustable height 150–600 mm", DE: "Verstellbare Höhe 150–600 mm" },
  pin3Title:      { SI: "Plenum cona", EN: "Plenum zone", DE: "Plenum-Zone" },
  pin3Desc:       { SI: "Hladilni kanal · kabelske trase", EN: "Cooling channel · cable routes", DE: "Kühlkanal · Kabeltrassen" },
};

const SERVICES = {
/* ─── SLOVENIAN ─────────────────────────────────────────────── */
SI: {
  "podatkovni-centri": {
    eyebrow: "Glavna dejavnost · od 2004",
    title: ["Podatkovni", <em key="e">centri.</em>],
    lede: "Načrtujemo, gradimo in vzdržujemo celovito infrastrukturo podatkovnih centrov, od električnih in strojnih instalacij do arhitekture, varnosti in monitoring sistemov.",
    hero: "/images/data-centers/_ABP7570.webp",
    coord: "[DC] Tier I–IV · Uptime Institute ATS",
    stats: [
      ["20+", "let specializacije"],
      ["Tier I-IV", "Uptime institute akreditacije"],
      ["24/7", "tehnična podpora"],
    ],
    cta: "Rezerviraj infrastrukturno svetovanje",
    intro: {
      label: "01, Specializacija",
      h: "Več kot IT.",
      body: [
        "S tem področjem se specializirano ukvarjamo že od leta 2004. Poznavanje sistemov IKT, ki so bili naša osnovna dejavnost od ustanovitve podjetja, predstavlja zgolj osnovni predpogoj za uspešno načrtovanje in izgradnjo podatkovnih centrov.",
        "Ta znanja se v podatkovnih centrih tesno prepletajo z drugimi, zelo specifičnimi strokami, strojne in električne instalacije, arhitektura, tehnična varnost. Naša načrtna specializacija kadrov nas je pripeljala do unikatnega tima, ki pokriva vsa ta področja.",
      ],
    },
    scopeTitle: "Storitve znotraj podatkovnih centrov",
    scope: [
      ["01", "UPS napajanje", "Brezprekinitveno napajanje, redundantne topologije N+1, 2N, 2(N+1)."],
      ["02", "Hlajenje DC", "CRAH/CRAC enote, free cooling, optimizacija PUE."],
      ["03", "Sistem zaprtih con", "Hot/cold aisle containment za največjo termično učinkovitost."],
      ["04", "Tehnični pod", "Dvignjeni podi za napeljave, hlajenje in kabelske trase."],
      ["05", "Nadzorni sistemi", "DCIM, monitoring napajanja, hlajenja in dostopa."],
      ["06", "Varnost in zaščita", "Požarna detekcija, gašenje, kontrola vstopa."],
      ["07", "Oddaljeno upravljanje", "KVM-over-IP rešitve, serial konzole, out-of-band dostop."],
      ["08", "Audit DC", "Evaluacija obstoječih centrov, ocena Tier, energijska učinkovitost, varnost."],
    ],
    accred: {
      label: "04, Akreditacija",
      h: "Prvi v Sloveniji <em>Accredited Tier Specialist.</em>",
      body: "Med našimi inženirji je strokovnjak, ki je kot prvi v Sloveniji akreditiran pri Uptime Institute kot Accredited Tier Specialist. Na tej podlagi ponujamo storitev DATA CENTER AUDIT, evaluacijo obstoječih podatkovnih centrov z oceno stanja in priporočili za povečanje razpoložljivosti, energijske učinkovitosti in fizične varnosti.",
      cred: "Uptime Institute · ATS",
    },
    clients: ["KRKA", "PETROL", "Institut Jožef Stefan", "Ministrstvo za izobraževanje", "Zavarovalnica TILIA", "Kemijski inštitut", "ARNES", "Ministrstvo za obrambo", "ARSO", "TE Šoštanj", "Ministrstvo za notranje zadeve"],
    faq: [
      ["Koliko časa traja izgradnja podatkovnega centra?", "Odvisno od obsega. Manjši serverski prostor (do 20 rack enot) je mogoče urediti v 4–8 tednih. Večji projekt Tier III obsega 6–18 mesecev od idejne zasnove do prevzema."],
      ["Kdaj je smiselno razmišljati o lastnem DC namesto colocationa?", "Ko strošek najema colocationa preseže stroške investicije v 3–5 letih, ali ko zahteve po varnosti in dostopnosti tega ne dopuščajo. Naredimo kalkulacijo za vaš primer."],
      ["Kaj pomeni Tier II in Tier III v praksi?", "Tier II pomeni redundantne komponente (N+1), en izpad komponente ne ustavi sistema. Tier III doda vzporedno vzdrževanje, sistem deluje med vsakim posegom. Tier III je standard za kritično infrastrukturo."],
      ["Ali ponujate vzdrževanje po izgradnji?", "Da. Ponujamo SLA pogodbe za vzdrževanje celotne infrastrukture, UPS, hlajenje, omrežje, varnost. Podpora je dostopna 24/7."],
      ["Kako poteka faza načrtovanja?", "Začnemo s tehničnim pregledom prostora in zahtev. Sledita idejni projekt in izvedbeni projekt z vsemi izračuni. Šele po potrditvi dokumentacije pričnemo z izvedbo."],
    ],
  },

  "racunalniska-omrezja": {
    eyebrow: "Osnovna dejavnost · od 1998",
    title: ["Računalniško", <em key="e">omrežje.</em>],
    lede: "Računalniška omrežja, optična in bakrena infrastruktura, LAN/WLAN aktivna oprema. Od dokumentacije do zagona po veljavnih standardih.",
    hero: "https://images.unsplash.com/photo-1544197150-b99a580bb7a8?w=2200&q=85&auto=format&fit=crop",
    coord: "[NET] OS2 · Cat6A · Wi-Fi 7",
    stats: [
      ["28", "let izkušenj"],
      ["Cat6A", "OS2 / OM4"],
      ["Wi-Fi 7", "MLO · 320 MHz"],
    ],
    cta: "Zahtevaj meritev",
    intro: {
      label: "01, Pristop",
      h: "Hrbtenica, ne le kabli.",
      body: [
        "Računalniška omrežja so naša osnovna dejavnost od ustanovitve podjetja leta 1998. Od strukturiranega bakrenega in optičnega ožičenja do aktivne LAN in WLAN opreme, projektiramo in izvajamo omrežja v poslovnih, industrijskih in javnih okoljih.",
        "Vsako instalacijo izvedemo po veljavnih standardih, dokumentiramo in certificiramo, tako da je omrežje zanesljiva osnova za vse, kar bo naprej teklo nad njim.",
      ],
    },
    scopeTitle: "Področja omrežnih rešitev",
    scope: [
      ["01", "Inteligentno ožičenje", "Sistem z avtomatsko detekcijo povezav in centralnim nadzorom."],
      ["02", "Bakreno ožičenje", "Cat6, Cat6A, Cat7, UTP/FTP/STP po EIA/TIA in ISO standardih."],
      ["03", "Optično ožičenje", "OS2 single-mode, OM3/OM4 multi-mode hrbtenice."],
      ["04", "Slim UTP/FTP kabli", "Triotronik tanki priključni kabli za gostejše rack pakiranje."],
      ["05", "LAN oprema", "Stikala, usmerjevalniki, projektiranje in dobava."],
      ["06", "Brezžična omrežja", "Wi-Fi 6 / Wi-Fi 7, point-to-point, industrijska WLAN."],
      ["07", "IT rešitve", "Konfiguracija, integracija in zagon omrežne infrastrukture."],
      ["08", "Meritve in certifikati", "Fluke meritve, dokumentacija, garancija proizvajalca."],
    ],
    accred: {
      label: "03, Standardi",
      h: "Po standardih, <em>z meritvami.</em>",
      body: "Vse instalacije izvajamo skladno z EIA/TIA-568, ISO/IEC 11801 in EN 50173. Po končani izvedbi omrežje certificiramo z meritvami Fluke in predamo dokumentacijo, ki je osnova za garancijo proizvajalca komponent (do 25 let).",
      cred: "EIA/TIA · ISO/IEC · EN",
    },
    clients: ["Telemach", "NLB", "Banka Koper", "Lek", "Mahle Letrika", "Helios", "ARNES", "Državni zbor RS", "JP Energetika", "UKC Maribor"],
    faq: [
      ["Kateri standard velja za računalniška omrežja?", "Projektiramo in izvajamo po standardih ISO/IEC 11801, EN 50173 in TIA-568. Vsaka instalacija je dokumentirana in izmerjena, brez tega ni prevzema."],
      ["Cat6A ali optika, kdaj kateri?", "Cat6A zadošča za 99% pisarniških in serverskih okolij (do 10Gbit na 100m). Optika je nujna za razdalje nad 100m, inter-building povezave in backbone omrežja v podatkovnih centrih."],
      ["Kako dolgo traja izvedba strukturiranega ožičenja?", "Manjše pisarniško omrežje (do 50 priključkov) v 2–5 dneh. Večji objekti z več nadstropji od 2 do 8 tednov, odvisno od dostopa in obsega."],
      ["Ali ponujate vzdrževanje omrežja po izvedbi?", "Da, preventivne preglede, certifikacijo obstoječih inštalacij, posodobitve aktivne opreme in interventna popravila."],
      ["Kdaj je smiselna zamenjava obstoječega omrežja?", "Ko obstoječe ožičenje ne podpira hitrosti nad 1Gbit, ko dokumentacija manjka, ali ko prihaja do rednih izpadov. Naredimo brezplačen pregled in oceno stanja."],
    ],
  },

  "dvignjeni-pod": {
    eyebrow: "Modularni sistemi",
    title: ["Dvignjeni", <em key="e">pod.</em>],
    lede: "Sistem dvignjenega (dvojnega, tehničnega) poda za podatkovne centre, serverske prostore, pisarne in razstavne prostore. Konstrukcija, panelne plošče, integracija.",
    hero: "/images/dvignjeni-pod.png",
    coord: "[FLOOR] kalcijev sulfat · A1",
    stats: [
      ["NESITE", "ekskluzivni partner"],
      ["A1", "negorljivo (DIN EN)"],
      ["Tetris", "Floor sistem"],
    ],
    cta: "Zahtevaj ponudbo",
    intro: {
      label: "01, Pristop",
      h: "Sistem pod vašimi tlemi.",
      body: [
        "Dvignjeni pod ni zgolj talna obloga. Je tehnični sistem, ki pod površino skriva elektro, strojne in IT instalacije ter omogoča njihovo enostavno vzdrževanje in prilagoditve skozi celotno življenjsko dobo objekta.",
        "Z modularno zasnovo omogoča hitro montažo, urejenost prostora in dolgoročno fleksibilnost brez zahtevnih gradbenih posegov.",
        "Rešitve načrtujemo skupaj z vsemi tehničnimi instalacijami, zato dvignjeni pod postane del usklajenega sistema in ne zgolj posamezen gradbeni element.",
      ],
    },
    scopeTitle: "Struktura in elementi poda",
    scopeSub: "Sistem sestavljajo štirje ključni stebri, ki skupaj tvorijo varno, stabilno in prilagodljivo tehnično podlago za vaš prostor.",
    scope: [
      ["01", "Nosilna podkonstrukcija", "Ogrodje, ki zagotavlja stabilnost in niveliranje celotnega sistema. Vključuje nastavljive jeklene podstavke (pedestale) in vezne profile (letve) za večjo horizontalno stabilnost."],
      ["02", "Jedra talnih plošč", "Izbira materiala določa ključne lastnosti poda. Kalcijev sulfat zagotavlja vrhunsko požarno zaščito (razred A1) in zvočno izolativnost, visoko-gostotne iverne plošče pa ponujajo stroškovno učinkovito rešitev za pisarniške prostore."],
      ["03", "Zaključne obloge", "Zgornji sloj, ki določa videz in funkcionalnost. Za tehnične prostore so na voljo antistatične (ESD) obloge (PVC, guma), za komercialne prostore pa estetski materiali, kot so tekstil, parket ali keramika."],
      ["04", "Funkcionalni dodatki", "Elementi, ki sistem povežejo z inštalacijami. Perforirane plošče za natančno usmerjanje hladnega zraka ter kabelski izhodi (krtačne uvodnice) in servisne dvigalke za enostaven dostop."],
    ],
    accred: {
      label: "06, Partnerstva",
      partner: true,
      h: "Uradni zastopnik za NESITE: <em>Evropski standard kakovosti.</em>",
      body: "Kot ekskluzivni partner priznanega italijanskega proizvajalca NESITE zagotavljamo celovito podporo, svetovanje, dobavo in izvedbo tehnološko naprednih sistemov dvignjenih podov za slovenski trg.",
      cred: "Uradni partner za Slovenijo",
    },
    clients: ["KRKA", "Institut Jožef Stefan", "ARNES", "NLB", "Telemach", "Državni zbor RS", "Ministrstvo za obrambo"],
    faq: [
      ["Kakšne obremenitve lahko prenese dvignjen pod?", "Nosilnost sistema je odvisna od izbire jedra plošče (iverna plošča ali kalcijev sulfat) in podkonstrukcije. Sistemi so testirani in certificirani v skladu s standardom EN 12825 ter razvrščeni v razrede nosilnosti. Standardne izvedbe prenesejo točkovne obremenitve od 2 kN do 5 kN (kar ustreza enakomerni obremenitvi do 12-15 kN/m²), za ekstremne zahteve v podatkovnih centrih pa so na voljo ojačani sistemi z nosilnostjo do 24 kN/m² ali več."],
      ["Katera jedra plošč so najbolj primerna za tehnične prostore?", "Za kritično infrastrukturo (strežniške sobe, podatkovni centri, elektro prostori) se zaradi strožjih požarnih in akustičnih zahtev praviloma uporablja kalcijev sulfat. Ta material je popolnoma negorljiv (razred A1 po DIN EN) in ponuja visoko mehansko stabilnost. Za klasične pisarniške prostore, kjer požarne zahteve niso tako ekstremne, pa so stroškovno najbolj učinkovite visoko-gostotne iverne plošče."],
      ["Kakšna je tipična višina dvignjenega poda in kako prilagodljiv je sistem?", "Sistem je 100 % modularen. Jekleni podstavki (pedestali) so višinsko nastavljivi, kar omogoča popolno niveliranje tal ne glede na neravnine osnovne betonske plošče. Konstrukcijska višina se lahko prilagaja od zgolj nekaj centimetrov (npr. 80 mm za nizkoprofilne pisarniške pode) pa vse do 1500 mm ali več v velikih podatkovnih centrih, kjer je pod podom potreben velik volumen za prezračevalne kanale in močnostne kabelske trase."],
      ["Kako poteka dostop do inštalacij pod podom?", "Ena največjih prednosti naših sistemov je enostaven dostop. Vsaka talna plošča je samostojna in jo je mogoče z uporabo namenske servisne dvigalke (priseska) kadarkoli dvigniti v nekaj sekundah. To omogoča hitro vzdrževanje, preurejanje kabelskih tras ali dodajanje novih priključkov brez ustavljanja delovnih procesov in brez uporabe posebnega orodja."],
      ["Kakšne končne obloge so na voljo za dvignjene pode?", "Izbira končne obloge je prilagojena namenu prostora. Za tehnične in elektro prostore dobavljamo plošče s tovarniško apliciranimi antistatičnimi (ESD) oblogami (PVC, guma, laminat), ki preprečujejo elektrostatične razelektritve. Za poslovne prostore pa so na voljo estetski zaključki, kot so tekstilni kvadratki, parket, keramika ali naravni kamen, ki se vizualno popolnoma zlijejo z arhitekturo objekta."],
    ],
  },

  "brezzicna-omrezja": {
    eyebrow: "WiFi · RF Engineering",
    title: ["WiFi", <em key="e">omrežja.</em>],
    lede: "Profesionalno načrtovanje, diagnostika in optimizacija Wi-Fi omrežij za pisarne, hotele, skladišča in industrijska okolja. Ne ugibamo, inženirimo.",
    hero: "/images/brezzicna-omrezja.png",
    coord: "[WLAN] Wi-Fi 6/7 · 100% verified",
    stats: [
      ["+70%", "povečan throughput"],
      ["100%", "preverjena pokritost"],
      ["3×", "gostota uporabnikov"],
    ],
    intro: {
      label: "01, Pristop",
      h: "Načrtujemo omrežja. Ne ugibamo.",
      body: [
        "Ne resetiramo usmerjevalnikov, diagnosticiramo in inženirsko rešujemo najbolj kompleksne težave s povezljivostjo. Naš inženirski pristop odpravi ugibanje iz Wi-Fi: uporabljamo profesionalno opremo in fizikalno utemeljeno načrtovanje, da zagotovimo pokritost, kapaciteto in zmogljivost.",
        "Mrtve cone, počasne hitrosti kljub hitri povezavi, prekinitve video klicev, zakasnitve v skladiščih, neuspeli roaming med dostopnimi točkami in zlom omrežja pri visoki gostoti uporabnikov, vsako od teh težav rešimo z meritvami in trajnim popravkom, ne z začasno rešitvijo.",
      ],
    },
    scopeTitle: "Inženirske storitve",
    scope: [
      ["01", "Site Survey", "Predictive in on-site RF analiza, mapiranje pokritosti pred izvedbo."],
      ["02", "Spectrum analiza", "Identifikacija ne-Wi-Fi motilcev: mikrovalovne pečice, kamere, radarji."],
      ["03", "Optimizacija airtime", "Uravnoteženje management overhead in podatkovnega prometa."],
      ["04", "Načrtovanje kapacitete", "High-density okolja, stabilnost pri obremenitvi tisočev naprav."],
      ["05", "Optimizacija roaminga", "Brezhibni prehod naprav med dostopnimi točkami."],
      ["06", "Validacija po izvedbi", "Rigorozno testiranje, 100% preverjanje, da omrežje ustreza projektu."],
      ["07", "Načrtovanje Wi-Fi 6/7", "MLO, 320 MHz kanali, deterministične latence."],
      ["08", "Industrijska in outdoor WLAN", "Point-to-point, point-to-multipoint, ruggedized AP-ji."],
    ],
    accred: {
      label: "02, Okolja",
      h: "Strateška okolja, <em>kjer mora delovati.</em>",
      body: "Inženirimo brezžične rešitve za najbolj zahtevne fizične prostore: korporativne pisarne (high-density open space, VoIP roaming, 50+ AP), skladišča in logistika (stropovi 12m+, motnje, 100% pokritost), hoteli (2000+ naprav, izolacija gostov), zdravstvo (latenca <5ms, 99.999% zanesljivost), proizvodni obrati (24/7 uptime, IoT, ekstremne motnje) in izobraževalne ustanove (5000+ uporabnikov, BYOD, mešano notranje/zunanje).",
      cred: "Ekahau · LANCOM · CWNE",
    },
    clients: ["TBD"],
    faq: [
      ["Kako se lotite načrtovanja brezžičnega omrežja?", "Začnemo s predictive site survey, RF modeliranjem prostora pred namestitvijo. Nato naredimo on-site meritve in validiramo pokritost, kapaciteto in roaming."],
      ["Kakšna je razlika med Wi-Fi 6 in Wi-Fi 7?", "Wi-Fi 6 (802.11ax) prinaša OFDMA in BSS Coloring za visoko gostoto. Wi-Fi 7 (802.11be) dodaja MLO (Multi-Link Operation) in 320 MHz kanale, drastično nižje latence in večja propustnost v zahtevnih okoljih."],
      ["Zakaj imamo mrtve cone kljub obstoječim dostopnim točkam?", "Najpogosteje gre za napačno postavitev AP-jev, interferenco sosednjih kanalov ali preveliko oddajno moč. Naredimo spectrum analizo in RF meritve ter določimo točen vzrok."],
      ["Kako dolgo traja izvedba Wi-Fi omrežja?", "Manjši pisarniški projekt (do 20 AP) v 2–5 dneh. Večji objekti (skladišča, hoteli, industrijski obrati) od 2 do 6 tednov, vključno z validacijo."],
      ["Ali ponujate vzdrževanje po izvedbi?", "Da, periodične site survey ponovitve, monitoring in optimizacije ob spremembah prostora ali povečanju gostote uporabnikov."],
    ],
  },
}, /* end SI */

/* ─── ENGLISH ────────────────────────────────────────────────── */
EN: {
  "podatkovni-centri": {
    eyebrow: "Core service · since 2004",
    title: ["Data", <em key="e">Centers.</em>],
    lede: "We design, build and maintain complete data center infrastructure — from electrical and mechanical systems to architecture, security and monitoring.",
    hero: "/images/data-centers/_ABP7570.webp",
    coord: "[DC] Tier I–IV · Uptime Institute ATS",
    stats: [
      ["20+", "years of expertise"],
      ["Tier I-IV", "Uptime Institute certified"],
      ["24/7", "technical support"],
    ],
    cta: "Request infrastructure consultation",
    intro: {
      label: "01, Expertise",
      h: "Beyond IT.",
      body: [
        "We have been specialising in this area since 2004. Our deep knowledge of ICT systems — our core business since the company's founding — is merely the baseline for successful data center design and construction.",
        "In data centers, this expertise interweaves closely with other highly specific disciplines: mechanical and electrical engineering, architecture, technical security. Our deliberate specialisation has brought together a unique team that covers all these areas.",
      ],
    },
    scopeTitle: "Services within data centers",
    scope: [
      ["01", "UPS Power", "Uninterruptible power supply, redundant topologies N+1, 2N, 2(N+1)."],
      ["02", "DC Cooling", "CRAH/CRAC units, free cooling, PUE optimisation."],
      ["03", "Containment Systems", "Hot/cold aisle containment for maximum thermal efficiency."],
      ["04", "Technical Flooring", "Raised floors for cable management, cooling and cable routes."],
      ["05", "Monitoring Systems", "DCIM, power, cooling and access monitoring."],
      ["06", "Security & Protection", "Fire detection, suppression, access control."],
      ["07", "Remote Management", "KVM-over-IP solutions, serial consoles, out-of-band access."],
      ["08", "DC Audit", "Assessment of existing centers, Tier evaluation, energy efficiency, security."],
    ],
    accred: {
      label: "04, Accreditation",
      h: "First in Slovenia <em>Accredited Tier Specialist.</em>",
      body: "One of our engineers is the first in Slovenia to be accredited by the Uptime Institute as an Accredited Tier Specialist. On this basis, we offer a DATA CENTER AUDIT service — evaluation of existing data centers with a condition assessment and recommendations for improving availability, energy efficiency and physical security.",
      cred: "Uptime Institute · ATS",
    },
    clients: ["KRKA", "PETROL", "Institut Jožef Stefan", "Ministry of Education", "Zavarovalnica TILIA", "Kemijski inštitut", "ARNES", "Ministry of Defence", "ARSO", "TE Šoštanj", "Ministry of the Interior"],
    faq: [
      ["How long does building a data center take?", "It depends on the scope. A smaller server room (up to 20 rack units) can be completed in 4–8 weeks. A larger Tier III project spans 6–18 months from concept to handover."],
      ["When does owning a DC make more sense than colocation?", "When the colocation rental cost exceeds the investment costs over 3–5 years, or when security and availability requirements prohibit it. We can run the numbers for your case."],
      ["What does Tier II vs Tier III mean in practice?", "Tier II means redundant components (N+1) — one component failure does not stop the system. Tier III adds concurrent maintainability; the system continues operating during any maintenance. Tier III is the standard for critical infrastructure."],
      ["Do you offer maintenance after construction?", "Yes. We offer SLA maintenance contracts for the entire infrastructure — UPS, cooling, network, security. Support available 24/7."],
      ["How does the design phase work?", "We start with a technical review of the space and requirements. This is followed by a concept design and an execution design with all calculations. Construction only begins after the documentation is approved."],
    ],
  },

  "racunalniska-omrezja": {
    eyebrow: "Core service · since 1998",
    title: ["Computer", <em key="e">Networks.</em>],
    lede: "Computer networks, fibre and copper infrastructure, LAN/WLAN active equipment. From documentation to commissioning, to current standards.",
    hero: "https://images.unsplash.com/photo-1544197150-b99a580bb7a8?w=2200&q=85&auto=format&fit=crop",
    coord: "[NET] OS2 · Cat6A · Wi-Fi 7",
    stats: [
      ["28", "years of experience"],
      ["Cat6A", "OS2 / OM4"],
      ["Wi-Fi 7", "MLO · 320 MHz"],
    ],
    cta: "Request a survey",
    intro: {
      label: "01, Approach",
      h: "The backbone, not just cables.",
      body: [
        "Computer networks have been our core service since the company's founding in 1998. From structured copper and fibre cabling to active LAN and WLAN equipment, we design and implement networks in commercial, industrial and public environments.",
        "Every installation is carried out to current standards, documented and certified, so the network is a reliable foundation for everything that runs above it.",
      ],
    },
    scopeTitle: "Areas of network solutions",
    scope: [
      ["01", "Intelligent Cabling", "System with automatic connection detection and centralised monitoring."],
      ["02", "Copper Cabling", "Cat6, Cat6A, Cat7, UTP/FTP/STP to EIA/TIA and ISO standards."],
      ["03", "Fibre Optic Cabling", "OS2 single-mode, OM3/OM4 multi-mode backbone networks."],
      ["04", "Slim UTP/FTP Cables", "Triotronik thin patch cables for denser rack packing."],
      ["05", "LAN Equipment", "Switches, routers, design and supply."],
      ["06", "Wireless Networks", "Wi-Fi 6 / Wi-Fi 7, point-to-point, industrial WLAN."],
      ["07", "IT Solutions", "Configuration, integration and network infrastructure commissioning."],
      ["08", "Measurements & Certification", "Fluke measurements, documentation, manufacturer's warranty."],
    ],
    accred: {
      label: "03, Standards",
      h: "By standards, <em>with measurements.</em>",
      body: "All installations are carried out in accordance with EIA/TIA-568, ISO/IEC 11801 and EN 50173. After completion, the network is certified with Fluke measurements and documentation is delivered, which is the basis for the manufacturer's component warranty (up to 25 years).",
      cred: "EIA/TIA · ISO/IEC · EN",
    },
    clients: ["Telemach", "NLB", "Banka Koper", "Lek", "Mahle Letrika", "Helios", "ARNES", "National Assembly", "JP Energetika", "UKC Maribor"],
    faq: [
      ["Which standard applies to computer networks?", "We design and install to ISO/IEC 11801, EN 50173 and TIA-568. Every installation is documented and measured — there's no handover without it."],
      ["Cat6A or fibre — when to choose which?", "Cat6A is sufficient for 99% of office and server environments (up to 10Gbit at 100m). Fibre is required for distances over 100m, inter-building links and backbone networks in data centers."],
      ["How long does structured cabling installation take?", "A small office network (up to 50 outlets) in 2–5 days. Larger multi-floor buildings take 2–8 weeks, depending on access and scope."],
      ["Do you offer network maintenance after installation?", "Yes — preventive inspections, certification of existing installations, active equipment upgrades and emergency repairs."],
      ["When does it make sense to replace an existing network?", "When the existing cabling cannot support speeds above 1Gbit, when documentation is missing, or when there are recurring outages. We provide a free assessment."],
    ],
  },

  "dvignjeni-pod": {
    eyebrow: "Modular systems",
    title: ["Raised", <em key="e">Floor.</em>],
    lede: "Raised (double, technical) floor systems for data centers, server rooms, offices and exhibition spaces. Structure, panel tiles, integration.",
    hero: "/images/dvignjeni-pod.png",
    coord: "[FLOOR] calcium sulphate · A1",
    stats: [
      ["NESITE", "exclusive partner"],
      ["A1", "non-combustible (DIN EN)"],
      ["Tetris", "Floor system"],
    ],
    cta: "Request a quote",
    intro: {
      label: "01, Approach",
      h: "A system beneath your floor.",
      body: [
        "A raised floor is more than a floor covering. It is a technical system that conceals electrical, mechanical and IT installations beneath the surface, allowing them to be easily maintained and adapted throughout the building's entire lifecycle.",
        "Its modular design enables fast installation, an orderly space and long-term flexibility without demanding construction work.",
        "We plan our solutions together with all technical installations, so the raised floor becomes part of a coordinated system rather than just a single structural element.",
      ],
    },
    scopeTitle: "Floor structure and elements",
    scopeSub: "The system is built on four key pillars that together form a safe, stable and adaptable technical base for your space.",
    scope: [
      ["01", "Load-bearing substructure", "The framework that ensures stability and levelling of the entire system. It includes adjustable steel pedestals and connecting stringers for greater horizontal stability."],
      ["02", "Floor panel cores", "The choice of material defines the floor's key properties. Calcium sulphate provides top-tier fire protection (class A1) and acoustic insulation, while high-density chipboard panels offer a cost-effective solution for office spaces."],
      ["03", "Finishes", "The top layer that determines appearance and functionality. Antistatic (ESD) finishes (PVC, rubber) are available for technical spaces, and aesthetic materials such as textile, parquet or ceramics for commercial spaces."],
      ["04", "Functional accessories", "Elements that connect the system to the installations. Perforated panels for precise cold-air direction, plus cable outlets (brush grommets) and service lifters for easy access."],
    ],
    accred: {
      label: "06, Partnerships",
      partner: true,
      h: "Official NESITE distributor: <em>a European standard of quality.</em>",
      body: "As the exclusive partner of the renowned Italian manufacturer NESITE, we provide comprehensive support, consulting, supply and installation of technologically advanced raised-floor systems for the Slovenian market.",
      cred: "Official partner for Slovenia",
    },
    clients: ["KRKA", "Institut Jožef Stefan", "ARNES", "NLB", "Telemach", "National Assembly", "Ministry of Defence"],
    faq: [
      ["What loads can a raised floor support?", "The system's load capacity depends on the choice of panel core (chipboard or calcium sulphate) and the substructure. Systems are tested and certified in accordance with the EN 12825 standard and classified into load classes. Standard versions support point loads from 2 kN to 5 kN (corresponding to a uniform load of up to 12–15 kN/m²), while for extreme data-center requirements reinforced systems with a capacity of up to 24 kN/m² or more are available."],
      ["Which panel cores are most suitable for technical spaces?", "For critical infrastructure (server rooms, data centers, electrical rooms), calcium sulphate is generally used due to stricter fire and acoustic requirements. This material is completely non-combustible (class A1 per DIN EN) and offers high mechanical stability. For conventional office spaces, where fire requirements are not as extreme, high-density chipboard panels are the most cost-effective."],
      ["What is the typical height of a raised floor and how adaptable is the system?", "The system is 100% modular. The steel pedestals are height-adjustable, allowing the floor to be perfectly levelled regardless of unevenness in the base concrete slab. The construction height can be adjusted from just a few centimetres (e.g. 80 mm for low-profile office floors) up to 1,500 mm or more in large data centers, where a large volume is needed beneath the floor for ventilation ducts and power cable routes."],
      ["How is access to the installations beneath the floor handled?", "One of the biggest advantages of our systems is easy access. Each floor panel is independent and can be lifted at any time within seconds using a dedicated service lifter (suction cup). This enables fast maintenance, rerouting of cables or adding new connections without stopping work processes and without special tools."],
      ["What finishes are available for raised floors?", "The choice of finish is tailored to the purpose of the space. For technical and electrical rooms we supply panels with factory-applied antistatic (ESD) finishes (PVC, rubber, laminate) that prevent electrostatic discharge. For business premises, aesthetic finishes are available, such as carpet tiles, parquet, ceramics or natural stone, which blend in perfectly with the building's architecture."],
    ],
  },

  "brezzicna-omrezja": {
    eyebrow: "WiFi · RF Engineering",
    title: ["WiFi", <em key="e">Networks.</em>],
    lede: "Professional design, diagnostics and optimisation of Wi-Fi networks for offices, hotels, warehouses and industrial environments. We don't guess — we engineer.",
    hero: "/images/brezzicna-omrezja.png",
    coord: "[WLAN] Wi-Fi 6/7 · 100% verified",
    stats: [
      ["+70%", "increased throughput"],
      ["100%", "verified coverage"],
      ["3×", "user density"],
    ],
    intro: {
      label: "01, Approach",
      h: "We design networks. We don't guess.",
      body: [
        "We don't reset routers — we diagnose and engineer solutions to the most complex connectivity problems. Our engineering approach removes the guesswork from Wi-Fi: we use professional tools and physics-based design to guarantee coverage, capacity and performance.",
        "Dead zones, slow speeds despite fast connections, dropped video calls, warehouse latency, failed roaming between access points and network collapse under high user density — we solve each of these with measurements and permanent fixes, not workarounds.",
      ],
    },
    scopeTitle: "Engineering services",
    scope: [
      ["01", "Site Survey", "Predictive and on-site RF analysis, coverage mapping before installation."],
      ["02", "Spectrum Analysis", "Identification of non-Wi-Fi interferers: microwave ovens, cameras, radars."],
      ["03", "Airtime Optimisation", "Balancing management overhead and data traffic."],
      ["04", "Capacity Planning", "High-density environments, stability under thousands of devices."],
      ["05", "Roaming Optimisation", "Seamless device transition between access points."],
      ["06", "Post-installation Validation", "Rigorous testing, 100% verification that the network meets the design."],
      ["07", "Wi-Fi 6/7 Design", "MLO, 320 MHz channels, deterministic latency."],
      ["08", "Industrial & Outdoor WLAN", "Point-to-point, point-to-multipoint, ruggedised APs."],
    ],
    accred: {
      label: "02, Environments",
      h: "Strategic environments, <em>where it must work.</em>",
      body: "We engineer wireless solutions for the most demanding physical spaces: corporate offices (high-density open space, VoIP roaming, 50+ APs), warehouses and logistics (12m+ ceilings, interference, 100% coverage), hotels (2000+ devices, guest isolation), healthcare (latency <5ms, 99.999% reliability), manufacturing plants (24/7 uptime, IoT, extreme interference) and educational institutions (5000+ users, BYOD, mixed indoor/outdoor).",
      cred: "Ekahau · LANCOM · CWNE",
    },
    clients: ["TBD"],
    faq: [
      ["How do you approach wireless network design?", "We start with a predictive site survey — RF modelling of the space before installation. We then carry out on-site measurements to validate coverage, capacity and roaming."],
      ["What is the difference between Wi-Fi 6 and Wi-Fi 7?", "Wi-Fi 6 (802.11ax) brings OFDMA and BSS Coloring for high density. Wi-Fi 7 (802.11be) adds MLO (Multi-Link Operation) and 320 MHz channels, dramatically lower latency and higher throughput in demanding environments."],
      ["Why do we have dead zones despite existing access points?", "Most often this is due to incorrect AP placement, adjacent channel interference or excessive transmit power. We carry out a spectrum analysis and RF measurements to identify the exact cause."],
      ["How long does a Wi-Fi network installation take?", "A small office project (up to 20 APs) in 2–5 days. Larger facilities (warehouses, hotels, industrial plants) take 2–6 weeks, including validation."],
      ["Do you offer maintenance after installation?", "Yes — periodic site survey repeats, monitoring and optimisations as the space changes or user density increases."],
    ],
  },
}, /* end EN */

/* ─── GERMAN ─────────────────────────────────────────────────── */
DE: {
  "podatkovni-centri": {
    eyebrow: "Kerngeschäft · seit 2004",
    title: ["Rechen-", <em key="e">zentren.</em>],
    lede: "Wir planen, bauen und betreiben vollständige Rechenzentruminfrastruktur — von Elektro- und Haustechnik bis zu Architektur, Sicherheit und Monitoring.",
    hero: "/images/data-centers/_ABP7570.webp",
    coord: "[DC] Tier I–IV · Uptime Institute ATS",
    stats: [
      ["20+", "Jahre Expertise"],
      ["Tier I-IV", "Uptime Institute zertifiziert"],
      ["24/7", "technischer Support"],
    ],
    cta: "Infrastrukturberatung anfragen",
    intro: {
      label: "01, Expertise",
      h: "Mehr als IT.",
      body: [
        "Auf dieses Gebiet haben wir uns seit 2004 spezialisiert. Tiefe Kenntnisse der IKT-Systeme — unser Kerngeschäft seit der Gründung — sind lediglich die Grundvoraussetzung für erfolgreiche Rechenzentrumplanung und -realisierung.",
        "In Rechenzentren verzahnt sich dieses Wissen eng mit anderen hochspezialisierten Disziplinen: Elektro- und Haustechnik, Architektur, technische Sicherheit. Unsere gezielte Spezialisierung hat ein einzigartiges Team zusammengebracht, das alle diese Bereiche abdeckt.",
      ],
    },
    scopeTitle: "Leistungen in Rechenzentren",
    scope: [
      ["01", "USV-Versorgung", "Unterbrechungsfreie Stromversorgung, redundante Topologien N+1, 2N, 2(N+1)."],
      ["02", "RZ-Kühlung", "CRAH/CRAC-Geräte, Free Cooling, PUE-Optimierung."],
      ["03", "Containment-Systeme", "Hot/Cold-Aisle-Containment für maximale thermische Effizienz."],
      ["04", "Doppelboden", "Hohlraumböden für Kabelführung, Kühlung und Kabeltrassen."],
      ["05", "Monitoring-Systeme", "DCIM, Strom-, Kühl- und Zugangsüberwachung."],
      ["06", "Sicherheit & Schutz", "Brandschutz, Löschanlage, Zutrittskontrolle."],
      ["07", "Fernverwaltung", "KVM-over-IP-Lösungen, serielle Konsolen, Out-of-Band-Zugang."],
      ["08", "RZ-Audit", "Bewertung bestehender Rechenzentren, Tier-Einstufung, Energieeffizienz, Sicherheit."],
    ],
    accred: {
      label: "04, Akkreditierung",
      h: "Erster in Slowenien <em>Accredited Tier Specialist.</em>",
      body: "Einer unserer Ingenieure ist der erste in Slowenien, der beim Uptime Institute als Accredited Tier Specialist akkreditiert wurde. Auf dieser Grundlage bieten wir einen DATACENTER AUDIT-Service an — Bewertung bestehender Rechenzentren mit Zustandsanalyse und Empfehlungen zur Verbesserung von Verfügbarkeit, Energieeffizienz und physischer Sicherheit.",
      cred: "Uptime Institute · ATS",
    },
    clients: ["KRKA", "PETROL", "Institut Jožef Stefan", "Bildungsministerium", "Zavarovalnica TILIA", "Kemijski inštitut", "ARNES", "Verteidigungsministerium", "ARSO", "TE Šoštanj", "Innenministerium"],
    faq: [
      ["Wie lange dauert der Bau eines Rechenzentrums?", "Je nach Umfang. Ein kleinerer Serverraum (bis 20 Rack-Einheiten) ist in 4–8 Wochen fertig. Ein größeres Tier-III-Projekt umfasst 6–18 Monate von der Planung bis zur Übergabe."],
      ["Wann ist ein eigenes RZ sinnvoller als Colocation?", "Wenn die Colocation-Mietkosten die Investitionskosten in 3–5 Jahren übersteigen oder Sicherheits- und Verfügbarkeitsanforderungen dies nicht zulassen. Wir rechnen Ihren Fall durch."],
      ["Was bedeutet Tier II und Tier III in der Praxis?", "Tier II bedeutet redundante Komponenten (N+1) — ein Komponentenausfall stoppt das System nicht. Tier III fügt parallele Wartungsfähigkeit hinzu; das System läuft bei jedem Eingriff weiter. Tier III ist der Standard für kritische Infrastruktur."],
      ["Bieten Sie Wartung nach der Inbetriebnahme an?", "Ja. Wir bieten SLA-Wartungsverträge für die gesamte Infrastruktur — USV, Kühlung, Netzwerk, Sicherheit. Support rund um die Uhr."],
      ["Wie läuft die Planungsphase ab?", "Wir beginnen mit einer technischen Begutachtung des Raums und der Anforderungen. Dann folgen Vorentwurf und Ausführungsplanung mit allen Berechnungen. Mit der Ausführung wird erst nach Freigabe der Dokumentation begonnen."],
    ],
  },

  "racunalniska-omrezja": {
    eyebrow: "Kerngeschäft · seit 1998",
    title: ["Computer-", <em key="e">netzwerke.</em>],
    lede: "Computernetzwerke, Glasfaser- und Kupferinfrastruktur, LAN/WLAN-Aktivkomponenten. Von der Dokumentation bis zur Inbetriebnahme nach geltenden Normen.",
    hero: "https://images.unsplash.com/photo-1544197150-b99a580bb7a8?w=2200&q=85&auto=format&fit=crop",
    coord: "[NET] OS2 · Cat6A · Wi-Fi 7",
    stats: [
      ["28", "Jahre Erfahrung"],
      ["Cat6A", "OS2 / OM4"],
      ["Wi-Fi 7", "MLO · 320 MHz"],
    ],
    cta: "Messung anfragen",
    intro: {
      label: "01, Ansatz",
      h: "Das Rückgrat, nicht nur Kabel.",
      body: [
        "Computernetzwerke sind unser Kerngeschäft seit der Gründung des Unternehmens im Jahr 1998. Von strukturierter Kupfer- und Glasfaserverkabelung bis zu aktiven LAN- und WLAN-Komponenten planen und realisieren wir Netzwerke in gewerblichen, industriellen und öffentlichen Umgebungen.",
        "Jede Installation wird nach geltenden Normen durchgeführt, dokumentiert und zertifiziert — damit das Netzwerk ein zuverlässiges Fundament für alles ist, was darüber laufen wird.",
      ],
    },
    scopeTitle: "Bereiche der Netzwerklösungen",
    scope: [
      ["01", "Intelligente Verkabelung", "System mit automatischer Verbindungserkennung und zentralem Monitoring."],
      ["02", "Kupferverkabelung", "Cat6, Cat6A, Cat7, UTP/FTP/STP nach EIA/TIA- und ISO-Normen."],
      ["03", "Glasfaserverkabelung", "OS2 Singlemode, OM3/OM4 Multimode-Backbone-Netzwerke."],
      ["04", "Slim UTP/FTP-Kabel", "Triotronik-Dünnpatchkabel für dichtere Rack-Bestückung."],
      ["05", "LAN-Ausrüstung", "Switches, Router, Planung und Lieferung."],
      ["06", "Drahtlose Netzwerke", "Wi-Fi 6 / Wi-Fi 7, Point-to-Point, industrielles WLAN."],
      ["07", "IT-Lösungen", "Konfiguration, Integration und Inbetriebnahme der Netzwerkinfrastruktur."],
      ["08", "Messungen & Zertifizierung", "Fluke-Messungen, Dokumentation, Herstellergarantie."],
    ],
    accred: {
      label: "03, Normen",
      h: "Nach Normen, <em>mit Messungen.</em>",
      body: "Alle Installationen werden gemäß EIA/TIA-568, ISO/IEC 11801 und EN 50173 durchgeführt. Nach Abschluss wird das Netzwerk mit Fluke-Messungen zertifiziert und eine Dokumentation übergeben, die die Grundlage für die Komponentengarantie des Herstellers (bis zu 25 Jahre) bildet.",
      cred: "EIA/TIA · ISO/IEC · EN",
    },
    clients: ["Telemach", "NLB", "Banka Koper", "Lek", "Mahle Letrika", "Helios", "ARNES", "Nationalversammlung", "JP Energetika", "UKC Maribor"],
    faq: [
      ["Welche Norm gilt für Computernetzwerke?", "Wir planen und installieren nach ISO/IEC 11801, EN 50173 und TIA-568. Jede Installation wird dokumentiert und gemessen — ohne das gibt es keine Abnahme."],
      ["Cat6A oder Glasfaser — wann welches?", "Cat6A reicht für 99 % der Büro- und Serverumgebungen (bis 10 Gbit auf 100 m). Glasfaser ist erforderlich für Strecken über 100 m, Gebäudeverbindungen und Backbone-Netzwerke in Rechenzentren."],
      ["Wie lange dauert die strukturierte Verkabelung?", "Ein kleines Büronetzwerk (bis 50 Anschlüsse) in 2–5 Tagen. Größere Gebäude mit mehreren Etagen dauern 2–8 Wochen, je nach Zugang und Umfang."],
      ["Bieten Sie Netzwerkwartung nach der Installation an?", "Ja — Präventivprüfungen, Zertifizierung bestehender Installationen, Upgrades von Aktivkomponenten und Notfallreparaturen."],
      ["Wann lohnt sich der Austausch eines bestehenden Netzwerks?", "Wenn die vorhandene Verkabelung keine Geschwindigkeiten über 1 Gbit unterstützt, wenn die Dokumentation fehlt oder wenn es zu regelmäßigen Ausfällen kommt. Wir bieten eine kostenlose Bestandsaufnahme."],
    ],
  },

  "dvignjeni-pod": {
    eyebrow: "Modulare Systeme",
    title: ["Doppel-", <em key="e">boden.</em>],
    lede: "Doppelbodenssysteme für Rechenzentren, Serverräume, Büros und Ausstellungsräume. Konstruktion, Bodenpanele, Integration.",
    hero: "/images/dvignjeni-pod.png",
    coord: "[FLOOR] Calciumsulfat · A1",
    stats: [
      ["NESITE", "Exklusivpartner"],
      ["A1", "nicht brennbar (DIN EN)"],
      ["Tetris", "Floor-System"],
    ],
    cta: "Angebot anfragen",
    intro: {
      label: "01, Ansatz",
      h: "Ein System unter Ihrem Boden.",
      body: [
        "Ein Doppelboden ist mehr als ein Bodenbelag. Er ist ein technisches System, das elektrische, maschinelle und IT-Installationen unter der Oberfläche verbirgt und deren einfache Wartung und Anpassung über die gesamte Lebensdauer des Gebäudes ermöglicht.",
        "Durch die modulare Bauweise ermöglicht er eine schnelle Montage, einen aufgeräumten Raum und langfristige Flexibilität ohne aufwändige Baueingriffe.",
        "Wir planen unsere Lösungen gemeinsam mit allen technischen Installationen, sodass der Doppelboden Teil eines abgestimmten Systems wird und nicht nur ein einzelnes Bauelement.",
      ],
    },
    scopeTitle: "Struktur und Elemente des Bodens",
    scopeSub: "Das System beruht auf vier zentralen Säulen, die gemeinsam eine sichere, stabile und anpassungsfähige technische Grundlage für Ihren Raum bilden.",
    scope: [
      ["01", "Tragende Unterkonstruktion", "Das Gerüst, das Stabilität und Nivellierung des gesamten Systems gewährleistet. Es umfasst verstellbare Stahlstützen (Pedestale) und Verbindungsprofile (Traversen) für höhere horizontale Stabilität."],
      ["02", "Kerne der Bodenplatten", "Die Materialwahl bestimmt die wesentlichen Eigenschaften des Bodens. Calciumsulfat bietet erstklassigen Brandschutz (Klasse A1) und Schalldämmung, während hochdichte Spanplatten eine kostengünstige Lösung für Büroräume bieten."],
      ["03", "Oberflächenbeläge", "Die oberste Schicht, die Aussehen und Funktionalität bestimmt. Für technische Räume sind antistatische (ESD) Beläge (PVC, Gummi) erhältlich, für gewerbliche Räume ästhetische Materialien wie Textil, Parkett oder Keramik."],
      ["04", "Funktionale Zubehörteile", "Elemente, die das System mit den Installationen verbinden. Perforierte Platten zur präzisen Lenkung der Kaltluft sowie Kabelauslässe (Bürstendurchführungen) und Service-Heber für einfachen Zugang."],
    ],
    accred: {
      label: "06, Partnerschaften",
      partner: true,
      h: "Offizieller NESITE-Vertreter: <em>europäischer Qualitätsstandard.</em>",
      body: "Als Exklusivpartner des renommierten italienischen Herstellers NESITE bieten wir umfassende Unterstützung, Beratung, Lieferung und Ausführung technologisch fortschrittlicher Doppelbodensysteme für den slowenischen Markt.",
      cred: "Offizieller Partner für Slowenien",
    },
    clients: ["KRKA", "Institut Jožef Stefan", "ARNES", "NLB", "Telemach", "Nationalversammlung", "Verteidigungsministerium"],
    faq: [
      ["Welche Lasten kann ein Doppelboden tragen?", "Die Tragfähigkeit des Systems hängt von der Wahl des Plattenkerns (Spanplatte oder Calciumsulfat) und der Unterkonstruktion ab. Die Systeme werden nach der Norm EN 12825 geprüft und zertifiziert und in Tragfähigkeitsklassen eingeteilt. Standardausführungen tragen Punktlasten von 2 kN bis 5 kN (was einer gleichmäßigen Last von bis zu 12–15 kN/m² entspricht), für extreme Anforderungen in Rechenzentren stehen verstärkte Systeme mit einer Tragfähigkeit von bis zu 24 kN/m² oder mehr zur Verfügung."],
      ["Welche Plattenkerne eignen sich am besten für technische Räume?", "Für kritische Infrastruktur (Serverräume, Rechenzentren, Elektroräume) wird aufgrund strengerer Brand- und Schallschutzanforderungen in der Regel Calciumsulfat verwendet. Dieses Material ist vollständig nicht brennbar (Klasse A1 nach DIN EN) und bietet hohe mechanische Stabilität. Für klassische Büroräume, in denen die Brandschutzanforderungen nicht so extrem sind, sind hochdichte Spanplatten am kostengünstigsten."],
      ["Wie hoch ist ein Doppelboden typischerweise und wie anpassungsfähig ist das System?", "Das System ist zu 100 % modular. Die Stahlstützen (Pedestale) sind höhenverstellbar, was eine perfekte Nivellierung des Bodens unabhängig von Unebenheiten der Betonbodenplatte ermöglicht. Die Konstruktionshöhe kann von nur wenigen Zentimetern (z. B. 80 mm für niedrige Büroböden) bis zu 1.500 mm oder mehr in großen Rechenzentren angepasst werden, wo unter dem Boden ein großes Volumen für Lüftungskanäle und Starkstromkabeltrassen benötigt wird."],
      ["Wie erfolgt der Zugang zu den Installationen unter dem Boden?", "Einer der größten Vorteile unserer Systeme ist der einfache Zugang. Jede Bodenplatte ist eigenständig und kann mit einem speziellen Service-Heber (Saugnapf) jederzeit in wenigen Sekunden angehoben werden. Das ermöglicht schnelle Wartung, das Umlegen von Kabeltrassen oder das Hinzufügen neuer Anschlüsse, ohne Arbeitsprozesse zu unterbrechen und ohne Spezialwerkzeug."],
      ["Welche Oberflächenbeläge sind für Doppelböden erhältlich?", "Die Wahl des Oberflächenbelags richtet sich nach dem Verwendungszweck des Raums. Für technische und Elektroräume liefern wir Platten mit werkseitig aufgebrachten antistatischen (ESD) Belägen (PVC, Gummi, Laminat), die elektrostatische Entladungen verhindern. Für Geschäftsräume stehen ästhetische Oberflächen wie Teppichfliesen, Parkett, Keramik oder Naturstein zur Verfügung, die sich optisch perfekt in die Architektur des Gebäudes einfügen."],
    ],
  },

  "brezzicna-omrezja": {
    eyebrow: "WiFi · HF-Engineering",
    title: ["Drahtlose", <em key="e">Netzwerke.</em>],
    lede: "Professionelle Planung, Diagnose und Optimierung von Wi-Fi-Netzwerken für Büros, Hotels, Lagerhäuser und industrielle Umgebungen. Wir raten nicht — wir engineeren.",
    hero: "/images/brezzicna-omrezja.png",
    coord: "[WLAN] Wi-Fi 6/7 · 100% verifiziert",
    stats: [
      ["+70%", "mehr Durchsatz"],
      ["100%", "verifizierte Abdeckung"],
      ["3×", "Nutzerdichte"],
    ],
    intro: {
      label: "01, Ansatz",
      h: "Wir planen Netzwerke. Wir raten nicht.",
      body: [
        "Wir setzen keine Router zurück — wir diagnostizieren und lösen die komplexesten Konnektivitätsprobleme ingenieurmäßig. Unser Engineering-Ansatz eliminiert das Raten aus Wi-Fi: Wir verwenden professionelle Werkzeuge und physikalisch fundierte Planung, um Abdeckung, Kapazität und Leistung zu garantieren.",
        "Tote Zonen, langsame Geschwindigkeiten trotz schneller Verbindung, abgebrochene Videoanrufe, Latenzen im Lager, fehlgeschlagenes Roaming zwischen Access Points und Netzwerkzusammenbruch bei hoher Nutzerdichte — wir lösen jedes dieser Probleme mit Messungen und dauerhaften Korrekturen, nicht mit Workarounds.",
      ],
    },
    scopeTitle: "Engineering-Dienstleistungen",
    scope: [
      ["01", "Site Survey", "Prädiktive und On-Site-HF-Analyse, Coverage-Mapping vor der Installation."],
      ["02", "Spektrumanalyse", "Identifikation von Nicht-Wi-Fi-Störern: Mikrowellen, Kameras, Radare."],
      ["03", "Airtime-Optimierung", "Ausgleich von Management-Overhead und Datenverkehr."],
      ["04", "Kapazitätsplanung", "High-Density-Umgebungen, Stabilität bei Tausenden von Geräten."],
      ["05", "Roaming-Optimierung", "Nahtloser Geräteübergang zwischen Access Points."],
      ["06", "Post-Installations-Validierung", "Rigorose Tests, 100 % Überprüfung, dass das Netzwerk dem Entwurf entspricht."],
      ["07", "Wi-Fi 6/7-Planung", "MLO, 320-MHz-Kanäle, deterministische Latenz."],
      ["08", "Industrielles & Outdoor-WLAN", "Point-to-Point, Point-to-Multipoint, robuste APs."],
    ],
    accred: {
      label: "02, Umgebungen",
      h: "Strategische Umgebungen, <em>wo es funktionieren muss.</em>",
      body: "Wir entwickeln drahtlose Lösungen für die anspruchsvollsten physischen Räume: Unternehmensbüros (High-Density Open Space, VoIP-Roaming, 50+ APs), Lagerhäuser und Logistik (12 m+ Decken, Interferenzen, 100 % Abdeckung), Hotels (2000+ Geräte, Gästeisolierung), Gesundheitswesen (Latenz <5 ms, 99,999 % Zuverlässigkeit), Produktionsbetriebe (24/7-Uptime, IoT, extreme Interferenzen) und Bildungseinrichtungen (5000+ Nutzer, BYOD, gemischt innen/außen).",
      cred: "Ekahau · LANCOM · CWNE",
    },
    clients: ["TBD"],
    faq: [
      ["Wie gehen Sie an die Planung eines Drahtlosnetzwerks heran?", "Wir beginnen mit einem prädiktiven Site Survey — HF-Modellierung des Raums vor der Installation. Anschließend führen wir On-Site-Messungen durch, um Abdeckung, Kapazität und Roaming zu validieren."],
      ["Was ist der Unterschied zwischen Wi-Fi 6 und Wi-Fi 7?", "Wi-Fi 6 (802.11ax) bringt OFDMA und BSS Coloring für hohe Dichte. Wi-Fi 7 (802.11be) fügt MLO (Multi-Link Operation) und 320-MHz-Kanäle hinzu — drastisch niedrigere Latenz und höherer Durchsatz in anspruchsvollen Umgebungen."],
      ["Warum haben wir tote Zonen trotz vorhandener Access Points?", "Meistens liegt es an falscher AP-Platzierung, Interferenz benachbarter Kanäle oder zu hoher Sendeleistung. Wir führen Spektrumanalysen und HF-Messungen durch, um die genaue Ursache zu ermitteln."],
      ["Wie lange dauert die Installation eines Wi-Fi-Netzwerks?", "Ein kleines Büroprojekt (bis 20 APs) in 2–5 Tagen. Größere Einrichtungen (Lager, Hotels, Industriebetriebe) dauern 2–6 Wochen inklusive Validierung."],
      ["Bieten Sie Wartung nach der Installation an?", "Ja — periodische Site-Survey-Wiederholungen, Monitoring und Optimierungen bei Raumänderungen oder steigender Nutzerdichte."],
    ],
  },
}, /* end DE */
};

const SERVICE_LIST = [
  ["podatkovni-centri", "Podatkovni centri", "01"],
  ["dvignjeni-pod", "Dvignjeni podi", "02"],
  ["racunalniska-omrezja", "Računalniška omrežja", "03"],
  ["brezzicna-omrezja", "WiFi", "04"],
];

function ServiceHero({ s }) {
  return (
    <section className="srv-hero">
      <div className="srv-hero__bg" style={{ backgroundImage: `url("${s.hero}")` }} />
      <div className="srv-hero__scrim" />
      <div className="container">
        <div className="srv-hero__inner">
          <div className="srv-hero__eyebrow">
            <span>{s.eyebrow}</span>
            <span className="srv-hero__eyebrow-sep" />
            <span className="srv-hero__eyebrow-coord">{s.coord}</span>
          </div>
          <h1>{s.title}</h1>
          <p className="srv-hero__lede">{s.lede}</p>
          <div className="srv-hero__stats">
            {s.stats.map(([n, l], i) => (
              <div className="srv-hero__stat" key={i}>
                <div className="num">{n}</div>
                <div className="label">{l}</div>
              </div>
            ))}
            {s.cta && (
              <a href="#contact" className="srv-hero__cta btn btn--primary"
                onClick={(e) => { e.preventDefault(); window.__openContactModal && window.__openContactModal(); }}>
                {s.cta} <Arrow size={13} className="arrow" />
              </a>
            )}
          </div>
        </div>
      </div>
    </section>
  );
}

function Intro({ intro }) {
  return (
    <section className="srv-intro">
      <div className="container">
        <div className="srv-intro__grid">
          <div className="srv-intro__label">
            <div className="sec-head__index"><span className="num">{intro.label.split(", ")[0]}</span><span>{intro.label.split(", ")[1]}</span></div>
          </div>
          <div className="srv-intro__body">
            <h2 dangerouslySetInnerHTML={{ __html: renderHL(intro.h) }} />
            {intro.body.map((p, i) => <p key={i}>{p}</p>)}
          </div>
        </div>
      </div>
    </section>
  );
}

function Scope({ title, sub, items, idx = "02" }) {
  return (
    <section className="srv-scope">
      <div className="container">
        <div className="sec-head">
          <div className="sec-head__left">
            <div className="sec-head__index"><span className="num">{idx}</span><span>{L(SRV_T.scopeEyebrow)}</span></div>
            <h2>{title}.</h2>
            {sub ? <p className="srv-scope__sub">{sub}</p> : null}
          </div>
        </div>
        <div className="srv-scope__grid">
          {items.map(([n, t, d]) => (
            <div className="srv-scope__item" key={n}>
              <div className="srv-scope__num">{n}</div>
              <div>
                <h3>{t}</h3>
                <p>{d}</p>
              </div>
            </div>
          ))}
        </div>
      </div>
    </section>
  );
}

function Accreditation({ a }) {
  return (
    <section className="srv-accred">
      <div className="container">
        <div className="srv-accred__inner">
          <div>
            <div className="sec-head__index"><span className="num">{a.label.split(", ")[0]}</span><span>{a.label.split(", ")[1]}</span></div>
            <h2 dangerouslySetInnerHTML={{ __html: renderHL(a.h) }} />
            <p>{a.body}</p>
          </div>
          <div className="srv-accred__badge">
            <div className={a.partner ? "srv-accred__badge-icon srv-accred__badge-icon--logo" : "srv-accred__badge-icon"}>
              {a.partner
                ? (a.logo
                    ? <img src={a.logo} alt={a.cred} className="srv-accred__badge-logo" />
                    : <span className="srv-accred__badge-ph">NESITE</span>)
                : (
                  <svg width="44" height="44" viewBox="0 0 44 44" fill="none" xmlns="http://www.w3.org/2000/svg">
                    <circle cx="22" cy="18" r="11" stroke="#ef7e2c" strokeWidth="1.5"/>
                    <path d="M16 18l4 4 8-8" stroke="#ef7e2c" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round"/>
                    <path d="M15.5 27L13 38l9-4 9 4-2.5-11" stroke="#ef7e2c" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round"/>
                  </svg>
                )}
            </div>
            <div className="srv-accred__badge-text">
              {!a.partner && <div className="mono small">{L(SRV_T.certLabel)}</div>}
              <div className="srv-accred__badge-title">{a.cred}</div>
            </div>
          </div>
        </div>
      </div>
    </section>
  );
}

function ClientsRow({ items, idx = "04" }) {
  const marqueeItems = [...items, ...items];
  return (
    <section className="srv-clients">
      <div className="container">
        <div className="srv-clients__head">
          <div className="sec-head__index"><span className="num">{idx}</span><span>{L(SRV_T.refEyebrow)}</span></div>
          <h2>{L(SRV_T.refH2)}</h2>
        </div>
      </div>
      <div className="logos-marquee">
        <div className="logos-marquee__track">
          {marqueeItems.map((c, i) => (
            <div className="logos-marquee__item" key={i}>
              <span className="logos-marquee__name">{c}</span>
            </div>
          ))}
        </div>
      </div>
    </section>
  );
}

function FAQ({ items, idx = "05" }) {
  const [open, setOpen] = React.useState(null);
  const toggle = (i) => setOpen(open === i ? null : i);
  return (
    <section className="srv-faq">
      <div className="container">
        <div className="srv-faq__head">
          <div className="sec-head__index"><span className="num">{idx}</span><span>{L(SRV_T.faqEyebrow)}</span></div>
          <h2>{L(SRV_T.faqH2)}</h2>
        </div>
        <div className="srv-faq__list">
          {items.map(([q, a], i) => (
            <div
              key={i}
              className={"srv-faq__item" + (open === i ? " is-open" : "")}
              onClick={() => toggle(i)}
            >
              <div className="srv-faq__q">
                <span>{q}</span>
                <span className="srv-faq__icon" aria-hidden="true">
                  <svg width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" strokeWidth="1.25">
                    <path d="M2 7h10M7 2v10" className="srv-faq__icon-plus" />
                    <path d="M2 7h10" className="srv-faq__icon-minus" />
                  </svg>
                </span>
              </div>
              <div className="srv-faq__a"><p>{a}</p></div>
            </div>
          ))}
        </div>
      </div>
    </section>
  );
}

/* ── Per-service article data ── */
const SERVICE_ARTICLES = {
  "podatkovni-centri": {
    tag: "Podatkovni centri",
    items: [
      { id:"N-024", date:"21. apr 2026", readtime:"6 min",
        img:"https://images.unsplash.com/photo-1558494949-ef010cbdcc31?w=1200&q=85&auto=format&fit=crop",
        title:"Predaja podatkovnega centra Tier III za farmacevtsko podjetje",
        excerpt:"Po 14 mesecih izvedbe smo predali 1.2 MW podatkovni center z 2N napajanjem in hot/cold aisle hlajenjem." },
      { id:"N-023", date:"08. apr 2026", readtime:"8 min",
        img:"https://images.unsplash.com/photo-1558494949-ef010cbdcc31?w=1200&q=85&auto=format&fit=crop",
        title:"PUE pod 1.3: kako smo prenovili hlajenje obstoječega DC",
        excerpt:"Zamenjava CRAH enot, ločitev hot/cold aisle in optimizacija zračnih tokov. Rezultat: 22% nižja poraba energije." },
      { id:"N-018", date:"29. jan 2026", readtime:"7 min",
        img:"https://images.unsplash.com/photo-1558494949-ef010cbdcc31?w=1200&q=85&auto=format&fit=crop",
        title:"Nadgradnja DC za finančno institucijo brez prekinitve",
        excerpt:"Zamenjava UPS sistema in distribucijskih plošč med produkcijo. 6 mesecev načrtovanja, nič prekinitev." },
    ],
  },
  "dvignjeni-pod": {
    tag: "Dvignjeni podi",
    items: [
      { id:"N-016", date:"15. jan 2026", readtime:"5 min",
        img:"/images/dvignjeni-pod.png",
        title:"NESITE Tetris Floor: zakaj je klasifikacija A1 ključna",
        excerpt:"Požarna varnost dvignjenih podov je pogosto spregledana. Razložimo, zakaj je A1 klasifikacija standardni zahtevek za serverske prostore." },
      { id:"N-014", date:"10. nov 2025", readtime:"6 min",
        img:"/images/dvignjeni-pod.png",
        title:"Modularna zasnova tehničnega poda za dolgoročno prilagodljivost",
        excerpt:"Kako višina pedestalov in kabelske trase vplivajo na enostavnost sprememb infrastrukture v prihodnje." },
      { id:"N-011", date:"22. sep 2025", readtime:"4 min",
        img:"/images/dvignjeni-pod.png",
        title:"Integracija dvignjenega poda z IT in strojnimi instalacijami",
        excerpt:"Tehnični pod ni samo podloga. Uskladitev elektro, strojnih in IT instalacij v enem sistemu od začetka." },
    ],
  },
  "racunalniska-omrezja": {
    tag: "Računalniška omrežja",
    items: [
      { id:"N-022", date:"27. mar 2026", readtime:"5 min",
        img:"https://images.unsplash.com/photo-1544197150-b99a580bb7a8?w=1200&q=85&auto=format&fit=crop",
        title:"Računalniška omrežja za 12-nadstropno poslovno stavbo",
        excerpt:"OS2 hrbtenica, Cat6A horizontalno omrežje, redundantni MMR prostori. Projekt dokončan tri tedne pred rokom." },
      { id:"N-013", date:"05. okt 2025", readtime:"7 min",
        img:"https://images.unsplash.com/photo-1544197150-b99a580bb7a8?w=1200&q=85&auto=format&fit=crop",
        title:"Cat6A ali optika: kdaj kateri in zakaj",
        excerpt:"Praktični vodnik za izbiro med bakrenim in optičnim sistemom glede na razdalje, hitrosti in zahteve projekta." },
      { id:"N-010", date:"18. avg 2025", readtime:"6 min",
        img:"https://images.unsplash.com/photo-1544197150-b99a580bb7a8?w=1200&q=85&auto=format&fit=crop",
        title:"Fluke meritve in certifikacija: zakaj dokumentacija ni opcija",
        excerpt:"Vsaka instalacija brez meritev je tveganje. Razložimo obseg certifikacije in pomen garancije proizvajalca." },
    ],
  },
};

function ServiceArticles({ serviceId, idx = "06" }) {
  const [articles, setArticles] = React.useState(null);

  React.useEffect(() => {
    const { wpPosts, fmtDate, decode, stripShortcodes, calcReadTime } = window.AdvantWP || {};
    if (!wpPosts) return;
    wpPosts('posts', { per_page: 4, orderby: 'date', order: 'desc' })
      .then(posts => {
        if (!posts || !posts.length) return;
        setArticles(posts.map(p => ({
          id:      String(p.id),
          title:   decode(p.title && p.title.rendered || ''),
          date:    fmtDate(p.date_gmt || p.date),
          excerpt: stripShortcodes(p.excerpt && p.excerpt.rendered || ''),
          readTime: calcReadTime(p.content && p.content.rendered),
        })).filter(a => a.title));
      })
      .catch(() => {});
  }, []);

  const data = SERVICE_ARTICLES[serviceId];
  const items = articles || (data && data.items) || [];
  if (!items.length) return null;

  return (
    <section className="srv-art">
      <div className="container">
        <div className="srv-faq__head">
          <div className="sec-head__index"><span className="num">{idx}</span><span>{L(SRV_T.contentEyebrow)}</span></div>
          <h2>{L(SRV_T.articlesH2)[0]}<br />{L(SRV_T.articlesH2)[1]}</h2>
        </div>
        <div className="srv-art__grid">
          {items.map(a => (
            <a className="srv-art__card" key={a.id} href={`${L(SRV_T.articleHref)}${a.slug || a.id}`}>
              <div className="srv-art__body">
                <div className="srv-art__meta">
                  <span>{a.date}</span><span className="dot" /><span>{a.id}</span>
                </div>
                <div className="srv-art__title">{a.title}</div>
                <p className="srv-art__excerpt">{a.excerpt}</p>
                <div className="srv-art__foot">
                  <span>{a.readTime} {L(SRV_T.readSuffix)}</span>
                  <Arrow size={12} className="arr" />
                </div>
              </div>
            </a>
          ))}
        </div>
        <div style={{ marginTop: 32 }}>
          <a href={L(SRV_T.allNewsHref)} className="btn">{L(SRV_T.allNews)} <Arrow size={13} className="arrow" /></a>
        </div>
      </div>
    </section>
  );
}


/* ─── DATA CENTER PAGE COMPONENTS ─── */

const DC_SUBSYSTEMS_ALL = {
SI: [
  {
    id: "ups", title: "Brezprekinitveno napajanje", subtitle: "UPS / DEA NAPAJANJE", img: "/images/dc-ups.jpg",
    content: [
      { label: "REDUNDANTNE TOPOLOGIJE", text: "Načrtujemo sisteme N+1, 2N in 2(N+1) za zagotovitev najvišje razpoložljivosti. Vsak izpad komponente je predviden vnaprej." },
      { label: "STATIČNI IN MODULARNI UPS", text: "Ponujamo sisteme za industrijske UPS enote do večmegavatnih DC prostorov, z možnostjo uporabe različnih sodobnih tipov baterij." },
      { label: "VZDRŽEVANJE IN SLA", text: "Preventivni pregledi, menjava baterij in 24/7 interventna podpora. Vaš DC nikoli ne spi, naša ekipa tudi ne." },
    ],
  },
  {
    id: "cooling", title: "Hlajenje", subtitle: "Precizna klimatizacija", img: "/images/dc-cooling.jpg",
    content: [
      { label: "CRAH / CRAC ENOTE", text: "Precizna klimatizacija za serverske prostore z natančno regulacijo temperature in vlažnosti, zasnovana za 24/7 delovanje z redundantnimi sistemi." },
      { label: "FREE COOLING", text: "Izkoristimo zunanje temperature za znižanje energetske porabe. Pravilno zasnovana strategija free coolinga zmanjša PUE pod 1.4." },
      { label: "UNIFLAIR PARTNER", text: "Kot uradni partner Schneider Electric Uniflair imamo dostop do celotnega kataloga DC hladilnih rešitev z garancijo proizvajalca." },
    ],
  },
  {
    id: "containment", title: "Sistem zaprtih con", subtitle: "Hot / cold aisle containment", img: "/images/dc-containment.jpg",
    content: [
      { label: "HOT/COLD AISLE", text: "Ločitev tokov toplega in hladnega zraka s transparentnimi pregradami ali polno zaprto cono drastično poveča učinkovitost hlajenja in zmanjša PUE." },
      { label: "MERLJIV ROI", text: "Pravilno implementiran containment sistem tipično zmanjša porabo energije za hlajenje za 20 do 40 odstotkov brez menjave obstoječe opreme." },
      { label: "INTEGRACIJA Z DVIGNJENIM PODOM", text: "Sistem zaprtih con zahteva usklajeno načrtovanje z dvignjenim podom in prezračevalnimi paneli za optimalno distribucijo hladnega zraka." },
    ],
  },
  {
    id: "monitoring", title: "Nadzorni sistemi", subtitle: "DCIM in monitoring", img: "/images/dc-monitoring.jpg",
    content: [
      { label: "DCIM PLATFORMA", text: "Celovit pregled nad napajanjem, hlajenjem, temperaturo, dostopom in omrežjem v realnem času. En sistem za celoten DC." },
      { label: "ALARMIRANJE IN ESKALACIJA", text: "Večnivojski alarmni sistem z SMS, e-mail in avtomatsko eskalacijo zagotavlja takojšnjo reakcijo ob vsakem odklonu od normalnega delovanja." },
      { label: "ODDALJENO UPRAVLJANJE", text: "KVM-over-IP rešitve in out-of-band dostop omogočajo popolno upravljanje strežniške infrastrukture brez fizične prisotnosti v DC prostoru." },
    ],
  },
  {
    id: "security", title: "Varnost in zaščita", subtitle: "Fizična varnost in požarna zaščita", img: "/images/dc-security.jpg",
    content: [
      { label: "KONTROLA DOSTOPA", text: "Večnivojski sistemi kontrole dostopa z biometriko, karticami in PIN kodo. Vsak vstop je evidentiran in avditiran." },
      { label: "POŽARNA DETEKCIJA IN GAŠENJE", text: "Zgodnje zaznavanje dima (VESDA), inertni plini za gašenje brez poškodb opreme. Sistem, ki zaščiti infrastrukturo, ne le prostor." },
      { label: "VIDEO NADZOR", text: "IP video nadzor z analitiko, snemanjem in oddaljenimi pregledi. Integracija z dostopnim sistemom za popolno sledljivost." },
    ],
  },
],
EN: [
  {
    id: "ups", title: "Uninterruptible power", subtitle: "UPS / GENERATOR POWER", img: "/images/dc-ups.jpg",
    content: [
      { label: "REDUNDANT TOPOLOGIES", text: "We design N+1, 2N and 2(N+1) systems to ensure the highest availability. Every component failure is anticipated in advance." },
      { label: "STATIC AND MODULAR UPS", text: "We offer systems ranging from industrial UPS units to multi-megawatt DC facilities, with a choice of modern battery types." },
      { label: "MAINTENANCE AND SLA", text: "Preventive inspections, battery replacement and 24/7 emergency support. Your DC never sleeps — neither does our team." },
    ],
  },
  {
    id: "cooling", title: "Cooling", subtitle: "Precision air conditioning", img: "/images/dc-cooling.jpg",
    content: [
      { label: "CRAH / CRAC UNITS", text: "Precision climate control for server rooms with accurate temperature and humidity regulation, designed for 24/7 operation with redundant systems." },
      { label: "FREE COOLING", text: "We harness outdoor temperatures to lower energy consumption. A properly designed free-cooling strategy reduces PUE below 1.4." },
      { label: "UNIFLAIR PARTNER", text: "As an official Schneider Electric Uniflair partner, we have access to the full catalogue of DC cooling solutions with manufacturer's warranty." },
    ],
  },
  {
    id: "containment", title: "Containment systems", subtitle: "Hot / cold aisle containment", img: "/images/dc-containment.jpg",
    content: [
      { label: "HOT/COLD AISLE", text: "Separating hot and cold air streams with transparent barriers or a fully enclosed aisle dramatically increases cooling efficiency and reduces PUE." },
      { label: "MEASURABLE ROI", text: "A properly implemented containment system typically reduces cooling energy consumption by 20 to 40 percent without replacing existing equipment." },
      { label: "RAISED-FLOOR INTEGRATION", text: "Containment requires coordinated design with the raised floor and ventilation panels for optimal cold-air distribution." },
    ],
  },
  {
    id: "monitoring", title: "Monitoring systems", subtitle: "DCIM and monitoring", img: "/images/dc-monitoring.jpg",
    content: [
      { label: "DCIM PLATFORM", text: "Comprehensive real-time oversight of power, cooling, temperature, access and network. One system for the entire DC." },
      { label: "ALARMING AND ESCALATION", text: "A multi-level alarm system with SMS, email and automatic escalation ensures an immediate response to any deviation from normal operation." },
      { label: "REMOTE MANAGEMENT", text: "KVM-over-IP solutions and out-of-band access enable full management of server infrastructure without physical presence in the DC." },
    ],
  },
  {
    id: "security", title: "Security and protection", subtitle: "Physical security and fire protection", img: "/images/dc-security.jpg",
    content: [
      { label: "ACCESS CONTROL", text: "Multi-level access control systems with biometrics, cards and PIN codes. Every entry is logged and audited." },
      { label: "FIRE DETECTION AND SUPPRESSION", text: "Early smoke detection (VESDA), inert gases for suppression without equipment damage. A system that protects the infrastructure, not just the room." },
      { label: "VIDEO SURVEILLANCE", text: "IP video surveillance with analytics, recording and remote review. Integrated with the access system for full traceability." },
    ],
  },
],
DE: [
  {
    id: "ups", title: "Unterbrechungsfreie Stromversorgung", subtitle: "USV / NETZERSATZ", img: "/images/dc-ups.jpg",
    content: [
      { label: "REDUNDANTE TOPOLOGIEN", text: "Wir planen N+1-, 2N- und 2(N+1)-Systeme für höchste Verfügbarkeit. Jeder Komponentenausfall ist im Voraus eingeplant." },
      { label: "STATISCHE UND MODULARE USV", text: "Wir bieten Systeme von industriellen USV-Einheiten bis zu Mehr-Megawatt-RZ-Anlagen, mit Auswahl moderner Batterietypen." },
      { label: "WARTUNG UND SLA", text: "Präventive Inspektionen, Batteriewechsel und 24/7-Notfallsupport. Ihr RZ schläft nie — unser Team auch nicht." },
    ],
  },
  {
    id: "cooling", title: "Kühlung", subtitle: "Präzisionsklimatisierung", img: "/images/dc-cooling.jpg",
    content: [
      { label: "CRAH / CRAC EINHEITEN", text: "Präzise Klimatisierung für Serverräume mit genauer Temperatur- und Feuchteregelung, ausgelegt für 24/7-Betrieb mit redundanten Systemen." },
      { label: "FREE COOLING", text: "Wir nutzen Außentemperaturen zur Senkung des Energieverbrauchs. Eine richtig konzipierte Free-Cooling-Strategie senkt den PUE unter 1,4." },
      { label: "UNIFLAIR-PARTNER", text: "Als offizieller Schneider-Electric-Uniflair-Partner haben wir Zugang zum gesamten Katalog der RZ-Kühllösungen mit Herstellergarantie." },
    ],
  },
  {
    id: "containment", title: "Containment-Systeme", subtitle: "Hot-/Cold-Aisle-Containment", img: "/images/dc-containment.jpg",
    content: [
      { label: "HOT/COLD AISLE", text: "Die Trennung von warmen und kalten Luftströmen mit transparenten Barrieren oder einer vollständig geschlossenen Zone steigert die Kühleffizienz drastisch und senkt den PUE." },
      { label: "MESSBARER ROI", text: "Ein korrekt umgesetztes Containment-System senkt den Kühlenergieverbrauch typischerweise um 20 bis 40 Prozent, ohne vorhandene Geräte auszutauschen." },
      { label: "DOPPELBODEN-INTEGRATION", text: "Containment erfordert eine abgestimmte Planung mit dem Doppelboden und den Lüftungspanelen für eine optimale Kaltluftverteilung." },
    ],
  },
  {
    id: "monitoring", title: "Monitoring-Systeme", subtitle: "DCIM und Monitoring", img: "/images/dc-monitoring.jpg",
    content: [
      { label: "DCIM-PLATTFORM", text: "Umfassende Echtzeitübersicht über Stromversorgung, Kühlung, Temperatur, Zugang und Netzwerk. Ein System für das gesamte RZ." },
      { label: "ALARMIERUNG UND ESKALATION", text: "Ein mehrstufiges Alarmsystem mit SMS, E-Mail und automatischer Eskalation gewährleistet eine sofortige Reaktion auf jede Abweichung vom Normalbetrieb." },
      { label: "FERNVERWALTUNG", text: "KVM-over-IP-Lösungen und Out-of-Band-Zugang ermöglichen die vollständige Verwaltung der Serverinfrastruktur ohne physische Präsenz im RZ." },
    ],
  },
  {
    id: "security", title: "Sicherheit und Schutz", subtitle: "Physische Sicherheit und Brandschutz", img: "/images/dc-security.jpg",
    content: [
      { label: "ZUTRITTSKONTROLLE", text: "Mehrstufige Zutrittskontrollsysteme mit Biometrie, Karten und PIN-Code. Jeder Zutritt wird protokolliert und auditiert." },
      { label: "BRANDFRÜHERKENNUNG UND LÖSCHUNG", text: "Frühe Rauchdetektion (VESDA), inerte Gase zur Löschung ohne Geräteschäden. Ein System, das die Infrastruktur schützt, nicht nur den Raum." },
      { label: "VIDEOÜBERWACHUNG", text: "IP-Videoüberwachung mit Analyse, Aufzeichnung und Fernzugriff. Integriert mit dem Zutrittssystem für vollständige Nachvollziehbarkeit." },
    ],
  },
],
};
const DC_SUBSYSTEMS = L(DC_SUBSYSTEMS_ALL);

function DCSubsystems({ rows }) {
  const data = (rows && rows.length) ? rows : DC_SUBSYSTEMS;
  const [active, setActive] = React.useState(null);
  const [visibleImg, setVisibleImg] = React.useState(0);

  const switchTo = (i) => {
    if (i === active) { setActive(null); return; }
    setVisibleImg(i);
    setActive(i);
  };

  return (
    <section className="srv-layers">
      <div className="container">
        <div className="srv-layers__grid srv-layers__grid--flush">
          <div className="srv-layers__left">
            <div className="srv-layers__head">
              <div className="sec-head__index"><span className="num">02</span><span>{L(SRV_T.infraEyebrow)}</span></div>
              <h2>{L(SRV_T.infraH2)[0]}<em>{L(SRV_T.infraH2)[1]}</em></h2>
            </div>
            {/* ACCORDION */}
            <div className="srv-layers__accordion">
              {data.map((sub, i) => {
                const isOpen = active === i;
                return (
                  <div key={sub.id} className={"srv-layers__item" + (isOpen ? " is-open" : "")}>
                    <button className="srv-layers__trigger" onClick={() => switchTo(i)}>
                      <span className="srv-layers__trigger-num mono">{String(i + 1).padStart(2, "0")}</span>
                      <span className="srv-layers__trigger-title">{sub.title}</span>
                      <span className="srv-layers__trigger-sub">{sub.subtitle}</span>
                      <span className="srv-layers__trigger-icon" aria-hidden="true">
                        <svg width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" strokeWidth="1.25">
                          <path d="M2 7h10M7 2v10" />
                          <path d="M2 7h10" />
                        </svg>
                      </span>
                    </button>
                    <div className="srv-layers__body">
                      <div className="srv-layers__body-inner">
                        <img src={sub.img} alt="" className="srv-layers__body-img" />
                        {(sub.content || []).map((item, j) => (
                          <div key={j} className="srv-layers__entry">
                            <div className="srv-layers__entry-label mono">{item.label}</div>
                            <p className="srv-layers__entry-text">{item.text}</p>
                          </div>
                        ))}
                      </div>
                    </div>
                  </div>
                );
              })}
            </div>
          </div>
          {/* STICKY IMAGE */}
          <div className="srv-layers__visual">
            <div className="srv-layers__img-wrap">
              {data.map((sub, i) => (
                <img
                  key={sub.img}
                  src={sub.img}
                  alt=""
                  className={"srv-layers__img" + (i === visibleImg ? " is-active" : "")}
                />
              ))}
            </div>
          </div>
        </div>
      </div>
    </section>
  );
}

const DC_AUDIT_POINTS_ALL = {
  SI: [
    { n: "01", t: "Ocena Tier stopnje", d: "Evalvacija razpoložljivosti po Uptime Institute metodologiji. Ugotovimo, kje ste danes in kaj je potrebno za dosego naslednjega Tier nivoja." },
    { n: "02", t: "Energijska učinkovitost", d: "Analiza PUE, identifikacija izgub in konkretna priporočila za znižanje stroškov delovanja brez kompromisov pri razpoložljivosti." },
    { n: "03", t: "Fizična varnost", d: "Pregled kontrole dostopa, video nadzora, požarne zaščite in odpornosti na fizične grožnje po uveljavljenih standardih." },
    { n: "04", t: "Pisno poročilo", d: "Celovit dokument z ugotovitvami, prioritiziranimi priporočili in oceno tveganj. Osnova za odločitve uprave in načrtovanje investicij." },
  ],
  EN: [
    { n: "01", t: "Tier-level assessment", d: "Availability evaluation using the Uptime Institute methodology. We determine where you stand today and what it takes to reach the next Tier level." },
    { n: "02", t: "Energy efficiency", d: "PUE analysis, loss identification and concrete recommendations to reduce operating costs without compromising availability." },
    { n: "03", t: "Physical security", d: "A review of access control, video surveillance, fire protection and resilience to physical threats against established standards." },
    { n: "04", t: "Written report", d: "A comprehensive document with findings, prioritised recommendations and a risk assessment. The basis for management decisions and investment planning." },
  ],
  DE: [
    { n: "01", t: "Tier-Bewertung", d: "Verfügbarkeitsbewertung nach der Uptime-Institute-Methodik. Wir ermitteln, wo Sie heute stehen und was nötig ist, um die nächste Tier-Stufe zu erreichen." },
    { n: "02", t: "Energieeffizienz", d: "PUE-Analyse, Identifikation von Verlusten und konkrete Empfehlungen zur Senkung der Betriebskosten ohne Kompromisse bei der Verfügbarkeit." },
    { n: "03", t: "Physische Sicherheit", d: "Überprüfung von Zutrittskontrolle, Videoüberwachung, Brandschutz und Widerstandsfähigkeit gegen physische Bedrohungen nach etablierten Standards." },
    { n: "04", t: "Schriftlicher Bericht", d: "Ein umfassendes Dokument mit Befunden, priorisierten Empfehlungen und einer Risikobewertung. Grundlage für Managemententscheidungen und Investitionsplanung." },
  ],
};
const DC_AUDIT_POINTS = L(DC_AUDIT_POINTS_ALL);

function DCAudit({ audit, points }) {
  const h2   = (audit && audit.h2) || L(SRV_T.auditH2);
  const body = (audit && audit.body != null) ? audit.body : L(SRV_T.auditBody);
  const cta  = (audit && audit.cta != null) ? audit.cta : L(SRV_T.auditCta);
  const pts  = (points && points.length) ? points : DC_AUDIT_POINTS;
  return (
    <section className="srv-audit">
      <div className="container">
        <div className="srv-audit__inner">
          <div className="srv-audit__left">
            <div className="sec-head__index"><span className="num">03</span><span>{L(SRV_T.serviceEyebrow)}</span></div>
            <h2>{h2[0]}<em>{h2[1]}</em></h2>
            <p className="srv-audit__body">{body}</p>
            <a href="#contact" className="btn btn--primary srv-audit__cta" onClick={e => { e.preventDefault(); window.__openContactModal && window.__openContactModal(); }}>
              {cta} <Arrow size={13} className="arrow" />
            </a>
          </div>
          <div className="srv-audit__right">
            <div className="srv-audit__badges">
              <div className="srv-audit__badge">
                <div className="srv-audit__badge-icon">
                  <svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
                    <circle cx="16" cy="13" r="8" stroke="#ef7e2c" strokeWidth="1.4"/>
                    <path d="M11 13l3.5 3.5L21 10" stroke="#ef7e2c" strokeWidth="1.4" strokeLinecap="round" strokeLinejoin="round"/>
                    <path d="M10.5 20L8 30l8-3 8 3-2.5-10" stroke="#ef7e2c" strokeWidth="1.4" strokeLinecap="round" strokeLinejoin="round"/>
                  </svg>
                </div>
                <div>
                  <div className="mono" style={{fontSize:10,letterSpacing:"0.1em",textTransform:"uppercase",color:"var(--hot)"}}>Uptime Institute</div>
                  <div className="srv-audit__badge-title">Accredited Tier Specialist</div>
                </div>
              </div>
              <div className="srv-audit__badge">
                <div className="srv-audit__badge-icon">
                  <svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
                    <circle cx="16" cy="13" r="8" stroke="#ef7e2c" strokeWidth="1.4"/>
                    <path d="M11 13l3.5 3.5L21 10" stroke="#ef7e2c" strokeWidth="1.4" strokeLinecap="round" strokeLinejoin="round"/>
                    <path d="M10.5 20L8 30l8-3 8 3-2.5-10" stroke="#ef7e2c" strokeWidth="1.4" strokeLinecap="round" strokeLinejoin="round"/>
                  </svg>
                </div>
                <div>
                  <div className="mono" style={{fontSize:10,letterSpacing:"0.1em",textTransform:"uppercase",color:"var(--hot)"}}>Uptime Institute</div>
                  <div className="srv-audit__badge-title">Accredited Tier Designer</div>
                </div>
              </div>
            </div>
            <div className="srv-audit__points">
              {pts.map(p => (
                <div className="srv-audit__point" key={p.n}>
                  <span className="srv-audit__point-n mono">{p.n}</span>
                  <div>
                    <div className="srv-audit__point-t">{p.t}</div>
                    <p className="srv-audit__point-d">{p.d}</p>
                  </div>
                </div>
              ))}
            </div>
          </div>
        </div>
      </div>
    </section>
  );
}

function DCProcessSection({ rows }) {
  const data = (rows && rows.length) ? rows : DC_HOME_SUBS;
  const [active, setActive] = React.useState(null);
  const [visibleImg, setVisibleImg] = React.useState(0);

  const switchTo = (i) => {
    if (i === active) { setActive(null); return; }
    setVisibleImg(i);
    setActive(i);
  };

  return (
    <section className="srv-layers">
      <div className="container">
        <div className="srv-layers__grid dc-home-accordion">
          <div className="srv-layers__visual">
            <div className="srv-layers__img-wrap">
              {data.map((sub, i) => (
                <img
                  key={sub.img || i}
                  src={sub.img}
                  alt=""
                  className={"srv-layers__img" + (i === visibleImg ? " is-active" : "")}
                />
              ))}
            </div>
          </div>
          <div className="srv-layers__accordion">
            {data.map((sub, i) => {
              const isOpen = active === i;
              return (
                <div key={sub.id} className={"srv-layers__item" + (isOpen ? " is-open" : "")}>
                  <button className="srv-layers__trigger" onClick={() => switchTo(i)}>
                    <span className="srv-layers__trigger-num mono">{String(i + 1).padStart(2, "0")}</span>
                    <span className="srv-layers__trigger-title">{sub.title}</span>
                    <span className="srv-layers__trigger-icon" aria-hidden="true">
                      <svg width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" strokeWidth="1.25">
                        <path d="M2 7h10M7 2v10" />
                        <path d="M2 7h10" />
                      </svg>
                    </span>
                  </button>
                  <div className="srv-layers__body">
                    <div className="srv-layers__body-inner">
                      <img src={sub.img} alt="" className="srv-layers__body-img" />
                      <p className="srv-layers__entry-intro">{sub.intro}</p>
                      <ul className="srv-layers__entry-list">
                      {(sub.items || []).map((it, j) => <li key={j}>{it}</li>)}
                      </ul>
                      <div className="srv-layers__entry-benefit">
                        <span className="mono">{L(SRV_T.benefits)}</span>
                        <span>{sub.benefit}</span>
                      </div>
                    </div>
                  </div>
                </div>
              );
            })}
          </div>
        </div>
      </div>
    </section>
  );
}

const FLOOR_LAYERS_ALL = {
SI: [
  {
    id: "core", title: "Core", subtitle: "Strukturno jedro panela", img: "/images/floor-layer-core.png",
    content: [
      { label: "IVERAL", text: "FSC® certificiran iveral razreda E1 z visoko gostoto 730 kg/m³. Zanesljiva osnova za standardne pisarniške in komercialne prostore." },
      { label: "KALCIJEV SULFAT", text: "Naša najpogostejša izbira za serverske prostore in podatkovne centre. Razred A1 negorljivosti, EPD certificirano, visoka nosilnost." },
      { label: "SINTRANI MATERIAL", text: "Za zahtevna okolja z visoko vlažnostjo ali zunanjo uporabo. Gostota 2.200 kg/m³, odporno na mraz in temperaturne spremembe." },
    ],
  },
  {
    id: "top", title: "Top finishing", subtitle: "Zgornja obloga", img: "/images/floor-layer-top.png",
    content: [
      { label: "OBLOGA PO MERI", text: "Laminat, parket, keramika, naravni kamen, jeklo, tekstil. Površina se prilagodi estetiki vsakega prostora brez kompromisov pri tehničnih lastnostih." },
      { label: "GOLA IZVEDBA", text: "Panel brez obloge je primeren za kasnejše pokrivanje ali dostop do podpodnega prostora. Prilagodljivost za prihodnje spremembe." },
    ],
  },
  {
    id: "bottom", title: "Bottom covering", subtitle: "Spodnja obloga panela", img: "/images/floor-layer-bottom.png",
    content: [
      { label: "PRIMER", text: "Anti-prašna zaščita za kalcijev sulfat panele. Preprečuje sproščanje delcev v podpodni prostor in hladilni kanal." },
      { label: "ALUMINIJEVA FOLIJA", text: "Tanka zaščita pred vlago. Primerna za okolja z normalno vlažnostjo in pisarniško rabo." },
      { label: "POCINKANA PLOČEVINA", text: "Najmočnejša zaščita pred vlago in mehanska ojačitev panela. Priporočena za serverske prostore in podatkovne centre." },
    ],
  },
  {
    id: "edge", title: "Edge trim", subtitle: "Robni profil", img: "/images/floor-layer-edge.png",
    content: [
      { label: "ABS PROFIL", text: "Termično in mehansko odporen robni profil ščiti panel pred udarci in zagotavlja brezhiben stik med ploščami." },
      { label: "MODULARNA SESTAVA", text: "Sistem utora in peresa omogoča hitro montažo, premestitev in razširitev brez posebnih orodij ali posegov v obstoječo strukturo." },
    ],
  },
],
EN: [
  {
    id: "core", title: "Core", subtitle: "Structural panel core", img: "/images/floor-layer-core.png",
    content: [
      { label: "CHIPBOARD", text: "FSC®-certified class E1 chipboard with a high density of 730 kg/m³. A reliable base for standard office and commercial spaces." },
      { label: "CALCIUM SULPHATE", text: "Our most common choice for server rooms and data centers. Class A1 non-combustibility, EPD certified, high load capacity." },
      { label: "SINTERED MATERIAL", text: "For demanding environments with high humidity or outdoor use. Density 2,200 kg/m³, resistant to frost and temperature changes." },
    ],
  },
  {
    id: "top", title: "Top finishing", subtitle: "Top covering", img: "/images/floor-layer-top.png",
    content: [
      { label: "CUSTOM FINISH", text: "Laminate, parquet, ceramics, natural stone, steel, textile. The surface adapts to the aesthetics of any space without compromising technical properties." },
      { label: "BARE VERSION", text: "A panel without a finish is suitable for later covering or access to the underfloor space. Flexibility for future changes." },
    ],
  },
  {
    id: "bottom", title: "Bottom covering", subtitle: "Panel bottom covering", img: "/images/floor-layer-bottom.png",
    content: [
      { label: "PRIMER", text: "Anti-dust protection for calcium sulphate panels. Prevents particle release into the underfloor space and cooling channel." },
      { label: "ALUMINIUM FOIL", text: "Thin moisture protection. Suitable for environments with normal humidity and office use." },
      { label: "GALVANISED SHEET", text: "The strongest moisture protection and mechanical reinforcement of the panel. Recommended for server rooms and data centers." },
    ],
  },
  {
    id: "edge", title: "Edge trim", subtitle: "Edge profile", img: "/images/floor-layer-edge.png",
    content: [
      { label: "ABS PROFILE", text: "A thermally and mechanically resistant edge profile protects the panel from impacts and ensures a flawless joint between tiles." },
      { label: "MODULAR ASSEMBLY", text: "A tongue-and-groove system enables fast installation, relocation and expansion without special tools or modifications to the existing structure." },
    ],
  },
],
DE: [
  {
    id: "core", title: "Core", subtitle: "Strukturkern des Panels", img: "/images/floor-layer-core.png",
    content: [
      { label: "SPANPLATTE", text: "FSC®-zertifizierte Spanplatte der Klasse E1 mit hoher Dichte von 730 kg/m³. Eine zuverlässige Basis für standardmäßige Büro- und Gewerbeflächen." },
      { label: "CALCIUMSULFAT", text: "Unsere häufigste Wahl für Serverräume und Rechenzentren. Klasse A1 nicht brennbar, EPD-zertifiziert, hohe Tragfähigkeit." },
      { label: "GESINTERTES MATERIAL", text: "Für anspruchsvolle Umgebungen mit hoher Feuchtigkeit oder Außeneinsatz. Dichte 2.200 kg/m³, frost- und temperaturwechselbeständig." },
    ],
  },
  {
    id: "top", title: "Top finishing", subtitle: "Obere Beschichtung", img: "/images/floor-layer-top.png",
    content: [
      { label: "MASSGESCHNEIDERTER BELAG", text: "Laminat, Parkett, Keramik, Naturstein, Stahl, Textil. Die Oberfläche passt sich der Ästhetik jedes Raums an, ohne Kompromisse bei den technischen Eigenschaften." },
      { label: "ROHE AUSFÜHRUNG", text: "Ein Panel ohne Belag eignet sich für eine spätere Abdeckung oder den Zugang zum Unterbodenraum. Flexibilität für zukünftige Änderungen." },
    ],
  },
  {
    id: "bottom", title: "Bottom covering", subtitle: "Untere Panelbeschichtung", img: "/images/floor-layer-bottom.png",
    content: [
      { label: "PRIMER", text: "Antistaubschutz für Calciumsulfat-Panele. Verhindert die Freisetzung von Partikeln in den Unterbodenraum und den Kühlkanal." },
      { label: "ALUMINIUMFOLIE", text: "Dünner Feuchtigkeitsschutz. Geeignet für Umgebungen mit normaler Feuchtigkeit und Büronutzung." },
      { label: "VERZINKTES BLECH", text: "Der stärkste Feuchtigkeitsschutz und die mechanische Verstärkung des Panels. Empfohlen für Serverräume und Rechenzentren." },
    ],
  },
  {
    id: "edge", title: "Edge trim", subtitle: "Randprofil", img: "/images/floor-layer-edge.png",
    content: [
      { label: "ABS-PROFIL", text: "Ein thermisch und mechanisch beständiges Randprofil schützt das Panel vor Stößen und gewährleistet eine einwandfreie Verbindung zwischen den Platten." },
      { label: "MODULARER AUFBAU", text: "Ein Nut-und-Feder-System ermöglicht schnelle Montage, Umsetzung und Erweiterung ohne Spezialwerkzeug oder Eingriffe in die bestehende Struktur." },
    ],
  },
],
};
const FLOOR_LAYERS = L(FLOOR_LAYERS_ALL);

function FloorLayers({ rows }) {
  const data = (rows && rows.length) ? rows : FLOOR_LAYERS;
  const [active, setActive] = React.useState(0);
  const [visibleImg, setVisibleImg] = React.useState(0);

  const switchTo = (i) => {
    if (i === active) { setActive(null); return; }
    setVisibleImg(i);
    setActive(i);
  };

  return (
    <section className="srv-layers srv-layers--floor">
      <div className="container">
        <div className="srv-layers__grid srv-layers__grid--flush">
          <div className="srv-layers__left">
            <div className="srv-layers__head">
              <div className="sec-head__index"><span className="num">03</span><span>{L(SRV_T.anatomyEyebrow)}</span></div>
              <h2>{L(SRV_T.componentsH2)[0]}<em>{L(SRV_T.componentsH2)[1]}</em></h2>
            </div>
            {/* ACCORDION */}
            <div className="srv-layers__accordion">
              {data.map((layer, i) => {
                const isOpen = active === i;
                return (
                  <div key={layer.id} className={"srv-layers__item" + (isOpen ? " is-open" : "")}>
                    <button className="srv-layers__trigger" onClick={() => switchTo(i)}>
                      <span className="srv-layers__trigger-num mono">{String(i + 1).padStart(2, "0")}</span>
                      <span className="srv-layers__trigger-title">{layer.title}</span>
                      <span className="srv-layers__trigger-sub">{layer.subtitle}</span>
                      <span className="srv-layers__trigger-icon" aria-hidden="true">
                        <svg width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" strokeWidth="1.25">
                          <path d="M2 7h10M7 2v10" className="plus" />
                          <path d="M2 7h10" className="minus" />
                        </svg>
                      </span>
                    </button>
                    <div className="srv-layers__body">
                      <div className="srv-layers__body-inner">
                        <img
                          src={layer.img}
                          alt=""
                          className="srv-layers__body-img"
                        />
                        {(layer.content || []).map((item, j) => (
                          <div key={j} className="srv-layers__entry">
                            <div className="srv-layers__entry-label mono">{item.label}</div>
                            <p className="srv-layers__entry-text">{item.text}</p>
                          </div>
                        ))}
                      </div>
                    </div>
                  </div>
                );
              })}
            </div>
          </div>

          {/* STICKY IMAGE */}
          <div className="srv-layers__visual">
            <div className="srv-layers__img-wrap">
              {data.map((layer, i) => (
                <img
                  key={layer.img}
                  src={layer.img}
                  alt=""
                  className={"srv-layers__img" + (i === visibleImg ? " is-active" : "")}
                />
              ))}
            </div>
          </div>
        </div>
      </div>
    </section>
  );
}

const SPECIAL_SOLUTIONS_ALL = {
  SI: [
    { id: "ss1", name: "Hitra izvedba", desc: "Suhomontažni sistem brez cementnega estriha omogoča hitro vgradnjo in takojšnjo prehodnost površine. Gradbena dela potekajo učinkoviteje, skupni čas izvedbe projekta pa se občutno skrajša.", img: "" },
    { id: "ss2", name: "Enostaven dostop do instalacij", desc: "Elektro, strojne in IT instalacije ostanejo varno skrite pod tlemi, vendar so vedno dostopne za servis, nadgradnje ali spremembe brez gradbenih posegov.", img: "" },
    { id: "ss3", name: "Varnost in zanesljivost", desc: "Sistem je zasnovan v skladu s standardom EN 12825 in izpolnjuje visoke zahteve glede nosilnosti, stabilnosti in varnosti. Izbrane izvedbe zagotavljajo tudi najvišji razred požarne odpornosti A1.", img: "" },
    { id: "ss4", name: "Svoboda pri oblikovanju", desc: "Široka izbira zaključnih oblog – od vinila, lesa in keramike do kamna ali stekla – omogoča popolno uskladitev tehničnih zahtev z arhitekturno zasnovo prostora.", img: "" },
  ],
  EN: [
    { id: "ss1", name: "Fast installation", desc: "A dry-assembly system without cement screed enables fast installation and an immediately walkable surface. Construction work proceeds more efficiently and the overall project time is significantly reduced.", img: "" },
    { id: "ss2", name: "Easy access to installations", desc: "Electrical, mechanical and IT installations stay safely hidden beneath the floor, yet remain accessible at any time for servicing, upgrades or changes without construction work.", img: "" },
    { id: "ss3", name: "Safety and reliability", desc: "The system is designed in accordance with the EN 12825 standard and meets high requirements for load capacity, stability and safety. Selected versions also provide the highest fire-resistance class, A1.", img: "" },
    { id: "ss4", name: "Design freedom", desc: "A wide range of finishes — from vinyl, wood and ceramics to stone or glass — allows technical requirements to be perfectly aligned with the architectural design of the space.", img: "" },
  ],
  DE: [
    { id: "ss1", name: "Schnelle Montage", desc: "Das Trockenbausystem ohne Zementestrich ermöglicht eine schnelle Montage und eine sofort begehbare Oberfläche. Die Bauarbeiten verlaufen effizienter und die Gesamtprojektdauer verkürzt sich erheblich.", img: "" },
    { id: "ss2", name: "Einfacher Zugang zu Installationen", desc: "Elektro-, Maschinen- und IT-Installationen bleiben sicher unter dem Boden verborgen, sind aber jederzeit für Wartung, Erweiterungen oder Änderungen ohne Baueingriffe zugänglich.", img: "" },
    { id: "ss3", name: "Sicherheit und Zuverlässigkeit", desc: "Das System ist nach der Norm EN 12825 ausgelegt und erfüllt hohe Anforderungen an Tragfähigkeit, Stabilität und Sicherheit. Ausgewählte Ausführungen bieten zudem die höchste Brandschutzklasse A1.", img: "" },
    { id: "ss4", name: "Gestaltungsfreiheit", desc: "Eine breite Auswahl an Oberflächenbelägen – von Vinyl, Holz und Keramik bis hin zu Stein oder Glas – ermöglicht die perfekte Abstimmung technischer Anforderungen auf die architektonische Gestaltung des Raums.", img: "" },
  ],
};
const SPECIAL_SOLUTIONS = L(SPECIAL_SOLUTIONS_ALL);

const DC_ADVANTAGES_ALL = {
  SI: [
    { n: "01", t: "Hlajenje", d: "Podpodni prostor je idealna lokacija za vse hladilne sisteme, od direktne distribucije zraka do cevovodov hladne vode." },
    { n: "02", t: "Visoka nosilnost", d: "Konstrukcija TR zagotavlja visoko mehansko zmogljivost za najzahtevnejše zahteve podatkovnih centrov." },
    { n: "03", t: "Prilagodljivost", d: "Vsi sistemi pod podom so pripravljeni na prihodnje spremembe: kabelske trase, napajanje, distribucija zraka." },
    { n: "04", t: "Nizki stroški vzdrževanja", d: "Dostop do podpodnega prostora je možen s praktično katerekoli točke v prostoru, brez dvigal ali posebnih orodij." },
  ],
  EN: [
    { n: "01", t: "Cooling", d: "The underfloor space is the ideal location for all cooling systems, from direct air distribution to chilled-water piping." },
    { n: "02", t: "High load capacity", d: "The TR construction provides high mechanical performance for the most demanding data center requirements." },
    { n: "03", t: "Flexibility", d: "All systems under the floor are ready for future changes: cable routes, power supply, air distribution." },
    { n: "04", t: "Low maintenance cost", d: "The underfloor space can be accessed from practically any point in the room, without lifts or special tools." },
  ],
  DE: [
    { n: "01", t: "Kühlung", d: "Der Unterbodenraum ist der ideale Ort für alle Kühlsysteme, von der direkten Luftverteilung bis zu Kaltwasserleitungen." },
    { n: "02", t: "Hohe Tragfähigkeit", d: "Die TR-Konstruktion bietet hohe mechanische Leistung für die anspruchsvollsten Anforderungen von Rechenzentren." },
    { n: "03", t: "Flexibilität", d: "Alle Systeme unter dem Boden sind auf zukünftige Änderungen vorbereitet: Kabeltrassen, Stromversorgung, Luftverteilung." },
    { n: "04", t: "Niedrige Wartungskosten", d: "Der Zugang zum Unterbodenraum ist praktisch von jedem Punkt im Raum möglich, ohne Hebezeuge oder Spezialwerkzeug." },
  ],
};
const DC_ADVANTAGES = L(DC_ADVANTAGES_ALL);

function DataCenterFloor({ floor, advantages }) {
  const h2   = (floor && floor.h2) || L(SRV_T.dcFloorH2);
  const lede = (floor && floor.lede != null) ? floor.lede : L(SRV_T.dcFloorLede);
  const img  = (floor && floor.img) || "/images/dc-floor-structure.jpg";
  const adv  = (advantages && advantages.length) ? advantages : DC_ADVANTAGES;
  return (
    <section className="srv-dc">
      <div className="container">
        <div className="srv-dc__head">
          <div className="sec-head__index"><span className="num">04</span><span>{L(SRV_T.dcFloorEyebrow)}</span></div>
          <h2>{h2[0]}<em>{h2[1]}</em></h2>
          <p className="srv-dc__lede">{lede}</p>
        </div>
        <div className="srv-dc__grid">
          <div className="srv-dc__visual">
            <img src={img} alt="Konstrukcija TR dvignjenega poda v podatkovnem centru" loading="lazy" />
            <div className="srv-dc__visual-tag mono">TR Structure · NESITE</div>
          </div>
          <div className="srv-dc__content">
            <div className="srv-dc__adv">
              {adv.map(a => (
                <div className="srv-dc__adv-item" key={a.n}>
                  <span className="srv-dc__adv-num mono">{a.n}</span>
                  <div>
                    <div className="srv-dc__adv-title">{a.t}</div>
                    <p className="srv-dc__adv-desc">{a.d}</p>
                  </div>
                </div>
              ))}
            </div>
          </div>
        </div>
      </div>
    </section>
  );
}

function SpecialSolutions({ items, head }) {
  const data = (items && items.length) ? items : SPECIAL_SOLUTIONS;
  const h = head || {};
  const h2parts = L(SRV_T.specialH2);
  return (
    <section className="srv-special">
      <div className="container">
        <div className="srv-special__head">
          <div className="sec-head__index"><span className="num">02</span><span>{h.eyebrow || L(SRV_T.nesiteEyebrow)}</span></div>
          {h.h2
            ? <h2 dangerouslySetInnerHTML={{ __html: renderHL(h.h2) }} />
            : <h2>{h2parts[0]}<em>{h2parts[1]}</em></h2>}
          <p className="srv-special__sub">{h.sub || L(SRV_T.specialSub)}</p>
        </div>
        <div className="srv-special__grid">
          {data.map((s) => (
            <div key={s.id} className="srv-special__card">
              {s.img ? (
                <div className="srv-special__media">
                  <img src={s.img} alt={s.name} loading="lazy" />
                </div>
              ) : null}
              <div className="srv-special__body">
                <div className="srv-special__name">{s.name}</div>
                <p className="srv-special__desc">{s.desc}</p>
              </div>
            </div>
          ))}
        </div>
      </div>
    </section>
  );
}

function ServiceVideo({ videoId }) {
  const [playing, setPlaying] = React.useState(false);
  return (
    <section className="srv-video">
      <div className="container">
        <div className="srv-video__wrap">
          {!playing ? (
            <button className="srv-video__thumb" onClick={() => setPlaying(true)} aria-label={L(SRV_T.playVideo)}>
              <img
                src={`https://img.youtube.com/vi/${videoId}/maxresdefault.jpg`}
                alt="NESITE Tetris Floor – video proizvajalca"
                className="srv-video__poster"
              />
              <div className="srv-video__scrim" />
              <div className="srv-video__play">
                <svg width="20" height="20" viewBox="0 0 20 20" fill="currentColor">
                  <path d="M6 4l12 6-12 6V4z" />
                </svg>
              </div>
              <div className="srv-video__caption">
                <span className="mono" style={{ fontSize: 10, letterSpacing: "0.1em", textTransform: "uppercase", color: "var(--hot)" }}>NESITE</span>
                <span style={{ fontSize: 13, color: "var(--ink-2)" }}>{L(SRV_T.videoCaption)}</span>
              </div>
            </button>
          ) : (
            <iframe
              className="srv-video__frame"
              src={`https://www.youtube.com/embed/${videoId}?autoplay=1&rel=0&modestbranding=1&color=white`}
              title="NESITE Tetris Floor"
              allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
              allowFullScreen
            />
          )}
        </div>
      </div>
    </section>
  );
}

function RaisedFloorVisual() {
  return (
    <section className="srv-floor-visual">
      <div className="container">
        <div className="srv-floor-visual__head">
          <div className="sec-head__index"><span className="num">03</span><span>{L(SRV_T.systemEyebrow)}</span></div>
          <h2>{L(SRV_T.floorVisualH2)[0]}<em>{L(SRV_T.floorVisualH2)[1]}</em></h2>
          <p className="srv-floor-visual__sub">{L(SRV_T.floorVisualSub)}</p>
        </div>
      </div>
      <div className="srv-floor-visual__wrap">
        <img
          src="/images/dvignjeni-pod-ai.jpg"
          alt="NESITE Tetris Floor sistem v podatkovnem centru – dvignjen pod z vidnimi kabelskimi trasami in pedestali"
          loading="lazy"
          className="srv-floor-visual__img"
        />
        <div className="srv-floor-visual__overlay">
          <div className="srv-floor-visual__pin srv-floor-visual__pin--1">
            <span className="srv-floor-visual__pin-dot" />
            <div className="srv-floor-visual__pin-label">
              <div className="srv-floor-visual__pin-title">{L(SRV_T.pin1Title)}</div>
              <div className="srv-floor-visual__pin-desc">{L(SRV_T.pin1Desc)}</div>
            </div>
          </div>
          <div className="srv-floor-visual__pin srv-floor-visual__pin--2">
            <span className="srv-floor-visual__pin-dot" />
            <div className="srv-floor-visual__pin-label">
              <div className="srv-floor-visual__pin-title">{L(SRV_T.pin2Title)}</div>
              <div className="srv-floor-visual__pin-desc">{L(SRV_T.pin2Desc)}</div>
            </div>
          </div>
          <div className="srv-floor-visual__pin srv-floor-visual__pin--3">
            <span className="srv-floor-visual__pin-dot" />
            <div className="srv-floor-visual__pin-label">
              <div className="srv-floor-visual__pin-title">{L(SRV_T.pin3Title)}</div>
              <div className="srv-floor-visual__pin-desc">{L(SRV_T.pin3Desc)}</div>
            </div>
          </div>
        </div>
        <div className="srv-floor-visual__badge">
          <span className="mono" style={{ fontSize: 10, letterSpacing: "0.1em", textTransform: "uppercase", color: "var(--hot)" }}>NESITE · Tetris Floor</span>
          <span style={{ color: "var(--ink-3)", fontSize: 12 }}>{L(SRV_T.partnerSlo)}</span>
        </div>
      </div>
    </section>
  );
}

function ServiceCTA() {
  return (
    <section className="about-cta">
      <div className="container">
        <div className="about-cta__inner">
          <h2>{L(SRV_T.ctaH2)[0]}<br/><em>{L(SRV_T.ctaH2)[1]}</em></h2>
          <div className="about-cta__actions">
            <a href="/#contact" className="btn btn--primary" onClick={e => { e.preventDefault(); window.__openContactModal && window.__openContactModal(); }}>
              <span>{L(SRV_T.ctaContact)}</span>
              <Arrow size={14} className="arrow" />
            </a>
            <a href="/#refs" className="btn btn--ghost">
              <span>{L(SRV_T.ctaRefs)}</span>
              <Arrow size={14} className="arrow" />
            </a>
          </div>
        </div>
      </div>
    </section>
  );
}

const DC_HERO_T = {
  h1Main:  { SI: "Podatkovni ", EN: "Data ", DE: "Rechen-" },
  h1Muted: { SI: "centri",      EN: "centers", DE: "zentren" },
  h1Em:    { SI: "od koncepta do dolgoročnega partnerstva.", EN: "from concept to long-term partnership.", DE: "vom Konzept bis zur langfristigen Partnerschaft." },
  intro:   { SI: "Nismo zgolj dobavitelj opreme. Dobavljamo sistem, usklajen, dokumentiran in vzdrževan. Z eno ekipo od prve risbe do brezhibnega delovanja.",
             EN: "We are not just an equipment supplier. We deliver a system — coordinated, documented and maintained. One team, from the first drawing to flawless operation.",
             DE: "Wir sind nicht nur ein Gerätelieferant. Wir liefern ein System — abgestimmt, dokumentiert und gewartet. Ein Team, von der ersten Zeichnung bis zum einwandfreien Betrieb." },
  kpis:    {
    SI: [["15+ LET", "življenjska doba"], ["≤ 1.3", "ciljni PUE"], ["TIER I-IV", "topologija"], ["24/7", "monitoring & SLA"]],
    EN: [["15+ YRS", "service life"], ["≤ 1.3", "target PUE"], ["TIER I-IV", "topology"], ["24/7", "monitoring & SLA"]],
    DE: [["15+ J.", "Lebensdauer"], ["≤ 1.3", "Ziel-PUE"], ["TIER I-IV", "Topologie"], ["24/7", "Monitoring & SLA"]],
  },
};

function DCHero({ s }) {
  const d = (s && s.dcHero) || {};
  const h1Main  = d.h1Main  != null ? d.h1Main  : L(DC_HERO_T.h1Main);
  const h1Muted = d.h1Muted != null ? d.h1Muted : L(DC_HERO_T.h1Muted);
  const h1Em    = d.h1Em    != null ? d.h1Em    : L(DC_HERO_T.h1Em);
  const intro   = d.intro   != null ? d.intro   : L(DC_HERO_T.intro);
  const kpis    = (d.kpis && d.kpis.length) ? d.kpis : L(DC_HERO_T.kpis);
  return (
    <section className="srv-hero dc-hero">
      <div className="srv-hero__bg">
        <video autoPlay muted loop playsInline className="srv-hero__bg-video"
          src="/assets/hero.m4v" poster={s.hero} />
      </div>
      <div className="srv-hero__scrim" />
      <div className="container">
        <div className="dc-hero__inner">
          <div className="dc-hero__lead">
            <h1 className="dc-hero__h">
              <span>{h1Main}<br /><span className="dc-hero__h-muted">{h1Muted}</span></span>
              <em>{h1Em}</em>
            </h1>
          </div>
          <div className="dc-hero__intro">
            <p>{intro}</p>
            <a href="#contact" className="btn btn--primary dc-hero__cta"
              onClick={(e) => { e.preventDefault(); window.__openContactModal && window.__openContactModal(); }}>
              {s.cta} <Arrow size={13} className="arrow" />
            </a>
          </div>
        </div>
        <div className="dc-hero__kpis">
          {kpis.map(([n, l], i) => (
            <div className="dc-hero__kpi" key={i}>
              <div className="dc-hero__kpi-num">{n}</div>
              <div className="dc-hero__kpi-lbl">{l}</div>
            </div>
          ))}
        </div>
      </div>
    </section>
  );
}

function ServiceApp() {
  const id = document.body.dataset.service;
  const pageLang = document.body.dataset.lang || "SI";
  const s = (SERVICES[pageLang] || SERVICES.SI)[id] || SERVICES.SI[id];
  const [modalOpen, setModalOpen] = React.useState(false);
  const [_wpTick, setWpTick] = React.useState(0);

  React.useEffect(() => {
    window.__openContactModal = () => setModalOpen(true);
  }, []);

  /* Fallback: hide preloader after 3 s even if WP never responds */
  React.useEffect(() => {
    const t = setTimeout(() => window.AdvantWP && window.AdvantWP.hidePreloader(), 3000);
    return () => clearTimeout(t);
  }, []);

  /* ── Map service id → WP options slug ── */
  const WP_SLUG_MAP = {
    'podatkovni-centri':    'dc',
    'racunalniska-omrezja': 'ro',
    'dvignjeni-pod':        'dp',
  };
  const wpSlug = WP_SLUG_MAP[id];

  React.useEffect(() => {
    if (!s || !wpSlug) { window.AdvantWP && window.AdvantWP.hidePreloader(); return; }
    const { wpOptions, wpPosts, gs, rep, repF, decode } = window.AdvantWP || {};
    if (!wpOptions) { window.AdvantWP && window.AdvantWP.hidePreloader(); return; }

    /* Apply global contact/nav to T */
    wpOptions('global').then(g => {
      const set = (obj, key, val) => { if (val) obj[key] = decode(val); };
      ['SI','EN','DE'].forEach(LANG => {
        const l = LANG.toLowerCase();
        const tl = T[LANG];
        set(tl.contact.meta, 'emailVal',   gs(g, `g_contact_email_${l}`));
        set(tl.contact.meta, 'phoneVal',   gs(g, `g_contact_phone_${l}`));
        set(tl.contact.meta, 'addressVal', gs(g, `g_contact_address_${l}`));
        set(tl.contact.meta, 'mapsUrl',    gs(g, `g_contact_maps_${l}`));
        set(tl.footer, 'emailVal', gs(g, `g_contact_email_${l}`));
        set(tl.footer, 'phoneVal', gs(g, `g_contact_phone_${l}`));
      });
    }).catch(() => {});

    Promise.all([
      wpOptions(wpSlug),
      /* news now live in standard Posts (novica CPT was removed) */
      wpPosts('posts', { per_page: 3, orderby: 'date', order: 'desc' }),
    ])
      .then(([opts, articles]) => {
        const l = (document.body.dataset.lang || 'SI').toLowerCase();
        const p = wpSlug; /* prefix, e.g. "dc" */

        /* ── Helper: set if non-empty, with decode ── */
        const set = (obj, key, val) => { if (val != null && val !== '') obj[key] = decode(String(val)); };

        /* Convert "a ==b==" → ["a ", "b"] for split-heading components (h2[0] + <em>h2[1]</em>) */
        const splitHL = (str) => {
          if (str == null || str === '') return null;
          const d = decode(String(str));
          const m = d.match(/^([\s\S]*?)==([\s\S]+?)==([\s\S]*)$/);
          return m ? [m[1], (m[2] + m[3])] : [d, ''];
        };

        /* ── Hero / top fields ── (DC has a bespoke 3-part hero + KPI strip) */
        if (p === 'dc') {
          const dcHero = {};
          const hMain  = gs(opts, `dc_hero_h1_main_${l}`);
          const hMuted = gs(opts, `dc_hero_h1_muted_${l}`);
          const hEm    = gs(opts, `dc_hero_h1_em_${l}`);
          if (hMain)  dcHero.h1Main  = decode(String(hMain));
          if (hMuted) dcHero.h1Muted = decode(String(hMuted));
          if (hEm)    dcHero.h1Em    = decode(String(hEm));
          const dcLede = gs(opts, `dc_hero_lede_${l}`);
          if (dcLede) dcHero.intro = decode(String(dcLede));
          const kpis = [];
          for (let i = 1; i <= 4; i++) {
            const n  = gs(opts, `dc_kpi${i}_num_${l}`);
            const lb = gs(opts, `dc_kpi${i}_label_${l}`);
            if (n) kpis.push([decode(String(n)), decode(String(lb || ''))]);
          }
          if (kpis.length) dcHero.kpis = kpis;
          if (Object.keys(dcHero).length) s.dcHero = dcHero;
          set(s, 'hero', gs(opts, `dc_hero_image_${l}`));
          set(s, 'cta',  gs(opts, `dc_hero_cta_${l}`));
        } else {
          set(s, 'eyebrow', gs(opts, `${p}_eyebrow_${l}`));
          set(s, 'lede',    gs(opts, `${p}_lede_${l}`));
          set(s, 'coord',   gs(opts, `${p}_coord_${l}`));
          set(s, 'cta',     gs(opts, `${p}_cta_${l}`));
          set(s, 'hero',    gs(opts, `${p}_hero_image_${l}`));
          const heroH1   = gs(opts, `${p}_hero_h1_${l}`);
          const heroH1Em = gs(opts, `${p}_hero_h1_em_${l}`);
          if (heroH1 || heroH1Em) {
            const mainPart = heroH1   ? decode(String(heroH1))   : '';
            const emPart   = heroH1Em ? decode(String(heroH1Em)) : '';
            s.title = emPart
              ? [mainPart, React.createElement('em', { key: 'e' }, emPart)]
              : mainPart;
          }
          /* Stats (3) — fixed grid `${p}_st{i}_value/label` */
          const statsWP = [];
          for (let i = 1; i <= 3; i++) {
            const n  = gs(opts, `${p}_st${i}_value_${l}`);
            const lb = gs(opts, `${p}_st${i}_label_${l}`);
            if (n) statsWP.push([decode(String(n)), decode(String(lb || ''))]);
          }
          if (statsWP.length) s.stats = statsWP;
        }

        /* ── Intro (all services) — body is up to three textareas, not a repeater ── */
        set(s.intro, 'label', gs(opts, `${p}_intro_label_${l}`));
        set(s.intro, 'h',     gs(opts, `${p}_intro_h_${l}`));
        const introBodies = [
          gs(opts, `${p}_intro_body1_${l}`),
          gs(opts, `${p}_intro_body2_${l}`),
          gs(opts, `${p}_intro_body3_${l}`),
        ].map(v => (v ? decode(String(v)) : '')).filter(Boolean);
        if (introBodies.length) s.intro.body = introBodies;

        /* ── Scope (RO/DP) — fixed grid `${p}_sc{i}_num/title/desc` (1..8) ── */
        const scopeWP = [];
        for (let i = 1; i <= 8; i++) {
          const t = gs(opts, `${p}_sc${i}_title_${l}`);
          if (!t) continue;
          scopeWP.push([
            decode(gs(opts, `${p}_sc${i}_num_${l}`) || String(i).padStart(2,'0')),
            decode(String(t)),
            decode(gs(opts, `${p}_sc${i}_desc_${l}`) || ''),
          ]);
        }
        if (scopeWP.length) s.scope = scopeWP;
        set(s, 'scopeTitle', gs(opts, `${p}_scope_title_${l}`));
        set(s, 'scopeSub',   gs(opts, `${p}_scope_sub_${l}`));

        /* ── Accreditation (RO/DP) ── */
        if (s.accred) {
          set(s.accred, 'label', gs(opts, `${p}_accred_label_${l}`));
          set(s.accred, 'h',     gs(opts, `${p}_accred_h_${l}`));
          set(s.accred, 'body',  gs(opts, `${p}_accred_body_${l}`));
          set(s.accred, 'cred',  gs(opts, `${p}_accred_cred_${l}`));
          set(s.accred, 'logo',  gs(opts, `${p}_accred_logo_${l}`));
        }

        /* ── Clients ── */
        const clientsWP = repF(opts, `${p}_${l}_clients`, 'name').map(decode).filter(Boolean);
        if (clientsWP.length) s.clients = clientsWP;

        /* ── FAQ ── */
        const faqRows = rep(opts, `${p}_${l}_faq`);
        if (faqRows.length) {
          /* answer is a WYSIWYG field → strip <p> wrappers (render adds its own <p>) */
          const stripP = (s) => String(s).replace(/<\/?p[^>]*>/gi, ' ').replace(/\s+/g, ' ').trim();
          s.faq = faqRows.map(r => [decode(r.question || ''), decode(stripP(r.answer || ''))]).filter(r => r[0]);
        }

        /* ── DC-specific sections: process + subsystems accordions, audit ── */
        if (p === 'dc') {
          const procRows = rep(opts, `dc_${l}_process`);
          if (procRows.length) {
            /* Slike so jezikovno neodvisne: če jezikovna vrstica nima slike, uporabi SI sliko po id-ju */
            const procSiImg = {}; rep(opts, `dc_si_process`).forEach(r => { if (r.id && r.img) procSiImg[r.id] = r.img; });
            s.dcProcess = procRows.map(r => ({
              id:       decode(r.id || ''),
              img:      r.img || procSiImg[r.id] || '',
              title:    decode(r.title || ''),
              subtitle: decode(r.subtitle || ''),
              intro:    decode(r.intro || ''),
              items:    [r.item1, r.item2, r.item3, r.item4].map(x => (x ? decode(x) : '')).filter(Boolean),
              benefit:  decode(r.benefit || ''),
            })).filter(x => x.title);
          }
          const subRows = rep(opts, `dc_${l}_subsystems`);
          if (subRows.length) {
            const subSiImg = {}; rep(opts, `dc_si_subsystems`).forEach(r => { if (r.id && r.img) subSiImg[r.id] = r.img; });
            s.dcSubsystems = subRows.map(r => ({
              id:       decode(r.id || ''),
              img:      r.img || subSiImg[r.id] || '',
              title:    decode(r.title || ''),
              subtitle: decode(r.subtitle || ''),
              content: [
                { label: decode(r.c1_label || ''), text: decode(r.c1_text || '') },
                { label: decode(r.c2_label || ''), text: decode(r.c2_text || '') },
                { label: decode(r.c3_label || ''), text: decode(r.c3_text || '') },
              ].filter(c => c.label || c.text),
            })).filter(x => x.title);
          }
          const audit = {};
          const aH2 = splitHL(gs(opts, `dc_audit_h2_${l}`));
          if (aH2) audit.h2 = aH2;
          const aBody = gs(opts, `dc_audit_body_${l}`); if (aBody) audit.body = decode(String(aBody));
          const aCta  = gs(opts, `dc_audit_cta_${l}`);  if (aCta)  audit.cta  = decode(String(aCta));
          if (Object.keys(audit).length) s.dcAudit = audit;
          const apts = [];
          for (let i = 1; i <= 4; i++) {
            const t = gs(opts, `dc_ap${i}_title_${l}`);
            if (!t) continue;
            apts.push({
              n: decode(gs(opts, `dc_ap${i}_n_${l}`) || String(i).padStart(2,'0')),
              t: decode(String(t)),
              d: decode(gs(opts, `dc_ap${i}_desc_${l}`) || ''),
            });
          }
          if (apts.length) s.dcAuditPoints = apts;
        }

        /* ── DP-specific sections: video, special solutions, floor layers, DC floor ── */
        if (p === 'dp') {
          set(s, 'videoId', gs(opts, `dp_video_id_${l}`));
          const ss = [];
          for (let i = 1; i <= 4; i++) {
            const name = gs(opts, `dp_ss${i}_name_${l}`);
            if (!name) continue;
            ss.push({
              id:   'ss' + i,
              name: decode(String(name)),
              desc: decode(gs(opts, `dp_ss${i}_desc_${l}`) || ''),
              img:  gs(opts, `dp_ss${i}_img_${l}`) || '',
              href: gs(opts, `dp_ss${i}_href_${l}`) || '',
            });
          }
          if (ss.length) s.specialSolutions = ss;
          const special = {};
          const ssEyebrow = gs(opts, `dp_ss_eyebrow_${l}`); if (ssEyebrow) special.eyebrow = decode(String(ssEyebrow));
          const ssH2      = gs(opts, `dp_ss_h2_${l}`);      if (ssH2)      special.h2      = decode(String(ssH2));
          const ssSub     = gs(opts, `dp_ss_sub_${l}`);     if (ssSub)     special.sub     = decode(String(ssSub));
          if (Object.keys(special).length) s.special = special;
          const flRows = rep(opts, `dp_${l}_floor_layers`);
          if (flRows.length) {
            const flSiImg = {}; rep(opts, `dp_si_floor_layers`).forEach(r => { if (r.id && r.img) flSiImg[r.id] = r.img; });
            s.floorLayers = flRows.map(r => ({
              id:       decode(r.id || ''),
              img:      r.img || flSiImg[r.id] || '',
              title:    decode(r.title || ''),
              subtitle: decode(r.subtitle || ''),
              content: [
                { label: decode(r.c1_label || ''), text: decode(r.c1_text || '') },
                { label: decode(r.c2_label || ''), text: decode(r.c2_text || '') },
                { label: decode(r.c3_label || ''), text: decode(r.c3_text || '') },
              ].filter(c => c.label || c.text),
            })).filter(x => x.title);
          }
          const floor = {};
          const fH2 = splitHL(gs(opts, `dp_dc_h2_${l}`));
          if (fH2) floor.h2 = fH2;
          const fLede = gs(opts, `dp_dc_lede_${l}`); if (fLede) floor.lede = decode(String(fLede));
          const fImg  = gs(opts, `dp_dc_img_${l}`);  if (fImg)  floor.img  = fImg;
          if (Object.keys(floor).length) s.dcFloor = floor;
          const adv = [];
          for (let i = 1; i <= 4; i++) {
            const t = gs(opts, `dp_dcadv${i}_title_${l}`);
            if (!t) continue;
            adv.push({
              n: decode(gs(opts, `dp_dcadv${i}_n_${l}`) || String(i).padStart(2,'0')),
              t: decode(String(t)),
              d: decode(gs(opts, `dp_dcadv${i}_desc_${l}`) || ''),
            });
          }
          if (adv.length) s.dcAdvantages = adv;
        }

        /* Expose WP articles globally for ServiceArticles component */
        if (articles && articles.length) {
          window.__WP_SERVICE_ARTICLES__ = articles.map(a => {
            const aacf = a.acf || {};
            const media = (a._embedded && a._embedded['wp:featuredmedia']) || [];
            return {
              id:    String(a.id),
              title: decode(a.title && a.title.rendered || ''),
              cat:   decode(gs(aacf, 'category') || ''),
              img:   gs(aacf, 'nov_hero_image') || (media[0] && media[0].source_url) || '',
            };
          });
        }

        setWpTick(t => t + 1);
        window.AdvantWP && window.AdvantWP.hidePreloader();
      })
      .catch(e => {
        console.warn('[AdvantWP] storitev load failed, using fallback.', e);
        window.AdvantWP && window.AdvantWP.hidePreloader();
      });
  }, [wpSlug]);

  if (!s) return <div style={{ padding: 80 }}>Storitev ne obstaja.</div>;

  return (
    <LangContext.Provider value={document.body.dataset.lang || "SI"}>
      <ScrollProgress />
      <AmbientOrb />
      <Header />
      {id === "podatkovni-centri" ? <DCHero s={s} /> : <ServiceHero s={s} />}
      {id === "podatkovni-centri" && <DCProcessSection rows={s.dcProcess} />}
      <Intro intro={s.intro} />
      {id === "podatkovni-centri" && <DCSubsystems rows={s.dcSubsystems} />}
      {id === "podatkovni-centri" && <DCAudit audit={s.dcAudit} points={s.dcAuditPoints} />}
      {id === "dvignjeni-pod" && <ServiceVideo videoId={s.videoId || "b1kNHRK3364"} />}
      {id === "dvignjeni-pod" && <SpecialSolutions items={s.specialSolutions} head={s.special} />}
      {id === "dvignjeni-pod" && <FloorLayers rows={s.floorLayers} />}
      {id === "dvignjeni-pod" && <DataCenterFloor floor={s.dcFloor} advantages={s.dcAdvantages} />}
      {id !== "podatkovni-centri" && <Scope title={s.scopeTitle} sub={s.scopeSub} items={s.scope}
        idx={id === "dvignjeni-pod" ? "05" : "02"} />}
      {id !== "podatkovni-centri" && <Accreditation a={s.accred} />}
      <ClientsRow items={s.clients}
        idx={id === "dvignjeni-pod" ? "07" : id === "podatkovni-centri" ? "04" : "04"} />
      <FAQ items={s.faq}
        idx={id === "dvignjeni-pod" ? "08" : id === "podatkovni-centri" ? "05" : "05"} />
      {id !== "podatkovni-centri" && id !== "racunalniska-omrezja" && id !== "dvignjeni-pod" && <ServiceArticles serviceId={id}
        idx="06" />}
      <Contact idx={
        id === "dvignjeni-pod" ? "09" :
        (id === "podatkovni-centri" || id === "racunalniska-omrezja") ? "06" : "05"
      } />
      <Footer />
      <ContactModal open={modalOpen} onClose={() => setModalOpen(false)} />
    </LangContext.Provider>
  );
}

ReactDOM.createRoot(document.getElementById("root")).render(<ServiceApp />);
