/* ════════════════════════════════════════════════════════════════ GK Associates — Content Loader v2.0 ───────────────────────────────────────────────────────────── Reads site_content/data.json and injects ALL site content. Scalar values → add data-key="some.dot.path" to any element. Array sections → empty containers with specific IDs are filled automatically (see section IDs below). Requires HTTP server (Live Server). Does NOT work over file://. ════════════════════════════════════════════════════════════════ */ (function () { 'use strict'; /* ── Resolve "a.b.c" dot-path against an object ───────────── */ function resolve(obj, path) { return path.split('.').reduce(function (o, k) { return (o != null && o[k] !== undefined) ? o[k] : null; }, obj); } /* ── Render an array into a container by ID ──────────────── */ function render(id, arr, fn) { var el = document.getElementById(id); if (el && Array.isArray(arr) && arr.length) { el.innerHTML = fn(arr); } } /* ══════════════════════════════════════════════════════════ CARD / ITEM BUILDERS ══════════════════════════════════════════════════════════ */ /* Hero trust panel → #home-trust-items (ul) */ function trustItem(item) { return '
  • ' + '\u2713' + '
    ' + '

    ' + item.title + '

    ' + '

    ' + item.desc + '

    ' + '
  • '; } /* Dark panel rows (core commitments / defines-us) → #home-core-commitments | #about-defines-us */ function darkPanelRows(items) { return items.map(function (item, i) { var cls = i === 0 ? 'pb-7 border-b border-white/10' : i === items.length - 1 ? 'pt-7' : 'py-7 border-b border-white/10'; return '
    ' + '

    ' + item.title + '

    ' + '

    ' + item.desc + '

    ' + '
    '; }).join(''); } /* Services summary cards → #home-services */ function serviceSummaryCard(svc) { return '
    ' + '
    ' + '' + svc.number + '' + '
    ' + '
    ' + '

    ' + svc.title + '

    ' + '

    ' + svc.subtitle + '

    ' + '

    ' + svc.summary + '

    ' + '
    '; } /* Why-choose-us items — light bg → #home-why-items */ function whyItemLight(item) { return '
    ' + '

    ' + item.title + '

    ' + '

    ' + item.desc + '

    ' + '
    '; } /* Core values cards → #about-core-values */ function coreValueCard(val) { return '
    ' + '
    ' + '' + val.letter + '' + '

    ' + val.title + '

    ' + '

    ' + val.desc + '

    ' + '
    '; } /* Why-choose-us items — dark bg → #about-why-items */ function whyItemDark(item) { return '
    ' + '

    ' + item.title + '

    ' + '

    ' + item.desc + '

    ' + '
    '; } /* Service detail cards → #services-list */ function serviceDetailCard(svc) { var items = (svc.items || []).map(function (item) { return '
  • \u2713' + item + '
  • '; }).join(''); return '
    ' + '
    ' + '
    ' + '
    ' + '

    ' + svc.number + '

    ' + '

    ' + svc.title + '

    ' + '

    ' + svc.subtitle + '

    ' + '
    ' + '
    ' + '
    ' + '
    ' + '

    ' + svc.detail + '

    ' + '' + '
    ' + '
    '; } /* Founder expertise tags → #founder-expertise */ function founderExpertiseTag(t) { return '' + t + ''; } /* Founder qualification tiles → #founder-qualifications */ function founderQualCard(q) { return '
    ' + '

    ' + q.title + '

    ' + '

    ' + q.subtitle + '

    ' + '
    '; } /* Team member cards → #team-list */ function teamCard(member) { var tags = (member.expertise || []).map(function (t) { return '' + t + ''; }).join(''); return '
    ' + '
    ' + '' + '' + '' + '
    ' + '
    ' + '

    ' + member.name + '

    ' + '

    ' + member.title + '

    ' + '

    ' + member.bio + '

    ' + '
    ' + tags + '
    ' + '
    ' + '
    '; } /* ══════════════════════════════════════════════════════════ MAIN INJECT — called once data.json is fetched ══════════════════════════════════════════════════════════ */ function applyData(data) { /* 1 ── Scalar: fill every element with data-key="dot.path" */ document.querySelectorAll('[data-key]').forEach(function (el) { var val = resolve(data, el.getAttribute('data-key')); if (val === null || val === undefined) return; if (el.tagName === 'IFRAME') { el.setAttribute('src', String(val)); } else { el.innerHTML = val; } }); /* 2 ── Arrays: render each section if the container exists */ /* index.html */ render('home-trust-items', data.home && data.home.trust_items, function (c) { return c.map(trustItem).join(''); }); render('home-core-commitments',data.home && data.home.core_commitments, darkPanelRows); render('home-services', data.services, function (c) { return c.map(serviceSummaryCard).join(''); }); render('home-why-items', data.why_choose_us, function (c) { return c.map(whyItemDark).join(''); }); /* about.html */ render('about-defines-us', data.about && data.about.defines_us, darkPanelRows); render('about-core-values', data.about && data.about.core_values, function (c) { return c.map(coreValueCard).join(''); }); render('about-why-items', data.why_choose_us, function (c) { return c.map(whyItemDark).join(''); }); /* services.html */ render('services-list', data.services, function (c) { return c.map(serviceDetailCard).join(''); }); /* team.html */ render('team-list', data.team, function (c) { return c.map(teamCard).join(''); }); render('founder-expertise', data.team && data.team[0] && data.team[0].expertise, function (c) { return c.map(founderExpertiseTag).join(''); }); render('founder-qualifications', data.team && data.team[0] && data.team[0].qualifications, function (c) { return c.map(founderQualCard).join(''); }); } /* ── Fetch site_content/data.json ─────────────────────────── */ fetch('./site_content/data.json') .then(function (res) { if (!res.ok) throw new Error('HTTP ' + res.status); return res.json(); }) .then(applyData) .catch(function (err) { console.warn('[GK Associates] content-loader: could not load data.json.', err); }); }());