/* Genesis DMA — Expansion pages: subservice, industry, work, case study, blog */ /* ---------- SUBSERVICE ---------- */ function SubservicePage({ parent, slug }) { const sub = window.SUBSERVICES[slug]; const parentSvc = window.SERVICES[parent]; const crumbs = [ { path: '/', label: 'Home' }, { path: '/capabilities/' + parent, label: parentSvc.title }, { path: `/capabilities/${parent}/${slug}`, label: sub.title }, ]; useSEO({ title: sub.metaTitle, description: sub.metaDesc, path: `/capabilities/${parent}/${slug}`, jsonLd: [ ldOrganization(), { "@context": "https://schema.org", "@type": "Service", "name": sub.h1, "serviceType": sub.title, "provider": { "@id": SITE.url + "#organization" }, "areaServed": { "@type": "Country", "name": "United States" }, "description": sub.metaDesc, "url": SITE.url + `/capabilities/${parent}/${slug}`, }, ldBreadcrumb(crumbs), ], }); const siblings = Object.values(window.SUBSERVICES).filter(x => x.parent === parent && x.slug !== slug); return (
{sub.intro}
{sub.focus.map(([t, d], i) => (

{t}

{d}

))}
{siblings.length > 0 && (
{siblings.slice(0,6).map((s, i) => (
Subservice

{s.title}

{s.lede}

Read more →
))}
)}
Want this run by the same team that writes about it?
Book a scoping call
); } /* ---------- INDUSTRY ---------- */ function IndustryPage({ slug }) { const ind = window.INDUSTRIES[slug]; const crumbs = [ { path: '/', label: 'Home' }, { path: '/industries', label: 'Industries' }, { path: '/industries/' + slug, label: ind.title }, ]; useSEO({ title: ind.metaTitle, description: ind.metaDesc, path: '/industries/' + slug, jsonLd: [ ldOrganization(), ldBreadcrumb(crumbs), ], }); const relatedServices = ind.services .map(s => window.SUBSERVICES[s]) .filter(Boolean); const relatedCases = window.CASE_STUDIES ? Object.values(window.CASE_STUDIES).filter(c => { const map = { medspa: 'Medspa', dental: 'Dental', 'home-services': 'Home services', healthcare: 'Healthcare', 'b2b-services': 'B2B Professional services', franchises: 'Franchises' }; return c.vertical === map[slug]; }) : []; return (
{ind.problems.map(([t, d], i) => (
Problem 0{i+1}

{t}

{d}

))}
{ind.solutions.map(([t, d], i) => (

{t}

{d}

))}
{relatedServices.map((s, i) => (
{window.SERVICES[s.parent].title}
{s.title}
))}
{ind.results.map(([n, c], i) => (
{n}
{c}
))}
{relatedCases.length > 0 && (
{relatedCases.map((cs, i) => (
{cs.vertical}

{cs.title}

{cs.lede}

Read case study →
))}
)}
Run a {ind.title.toLowerCase()} business? Let's talk.
Request a scoping call
); } /* ---------- INDUSTRIES INDEX ---------- */ function IndustriesIndexPage() { const crumbs = [{ path: '/', label: 'Home' }, { path: '/industries', label: 'Industries' }]; useSEO({ title: 'Industries we serve — Genesis DMA', description: 'Genesis DMA works with medspas, dental practices, home services, healthcare, B2B professional services and franchise operators.', path: '/industries', jsonLd: [ldOrganization(), ldBreadcrumb(crumbs)], }); const inds = Object.values(window.INDUSTRIES); return (
{inds.map((ind, i) => (
Industry

{ind.title}

{ind.lede}

Read more →
))}
); } /* ---------- WORK INDEX ---------- */ function WorkIndexPage() { const crumbs = [{ path: '/', label: 'Home' }, { path: '/work', label: 'Work' }]; useSEO({ title: 'Work & case studies — Genesis DMA', description: 'Engagements where we owned the outcome. Case studies from home services, medspa and B2B professional service clients.', path: '/work', jsonLd: [ldOrganization(), ldBreadcrumb(crumbs)], }); const cases = Object.values(window.CASE_STUDIES); return (
{cases.map((cs, i) => (
{cs.vertical}

{cs.title}

{cs.lede}

{cs.headline.map(([n, c], j) => (
{n}
{c}
))}
Read full case study →
))}
); } /* ---------- CASE STUDY ---------- */ function CaseStudyPage({ slug }) { const cs = window.CASE_STUDIES[slug]; const crumbs = [ { path: '/', label: 'Home' }, { path: '/work', label: 'Work' }, { path: '/work/' + slug, label: cs.title }, ]; useSEO({ title: cs.metaTitle, description: cs.metaDesc, path: '/work/' + slug, jsonLd: [ ldOrganization(), { "@context": "https://schema.org", "@type": "Article", "headline": cs.title, "description": cs.metaDesc, "publisher": { "@id": SITE.url + "#organization" }, "url": SITE.url + "/work/" + slug, }, ldBreadcrumb(crumbs), ], }); const relatedSubs = cs.services .map(s => window.SUBSERVICES[s]) .filter(Boolean); return (
{cs.headline.map(([n, c], i) => (
{n}
{c}
))}
{cs.challenge}
    {cs.approach.map(([t, d], i) => (
    0{i+1}

    {t}

    {d}
    ))}
{cs.outcome}
{relatedSubs.map((s, i) => (
{window.SERVICES[s.parent].title}
{s.title}
))}
Want outcomes like these? Let's see if we are a fit.
Book a scoping call
); } /* ---------- BLOG INDEX ---------- */ function BlogIndexPage() { const crumbs = [{ path: '/', label: 'Home' }, { path: '/blog', label: 'Blog' }]; useSEO({ title: 'Blog — Genesis DMA', description: 'Notes from the field. Practical writing on growth, paid media, CRM, automation and attribution for service businesses.', path: '/blog', jsonLd: [ ldOrganization(), ldBreadcrumb(crumbs), { "@context": "https://schema.org", "@type": "Blog", "url": SITE.url + "/blog", "name": "Genesis DMA Blog", "publisher": { "@id": SITE.url + "#organization" }, }, ], }); const posts = Object.values(window.BLOG_POSTS).sort((a,b) => b.date.localeCompare(a.date)); return (
{posts.map((p, i) => (
{p.category}
{p.date} · {p.readingTime}

{p.title}

{p.excerpt}

))}
); } /* ---------- BLOG POST ---------- */ function BlogPostPage({ slug }) { const p = window.BLOG_POSTS[slug]; const crumbs = [ { path: '/', label: 'Home' }, { path: '/blog', label: 'Blog' }, { path: '/blog/' + slug, label: p.title }, ]; useSEO({ title: p.metaTitle, description: p.metaDesc, path: '/blog/' + slug, jsonLd: [ ldOrganization(), { "@context": "https://schema.org", "@type": "BlogPosting", "headline": p.title, "description": p.metaDesc, "datePublished": p.date, "author": { "@type": "Organization", "name": "Genesis DMA" }, "publisher": { "@id": SITE.url + "#organization" }, "mainEntityOfPage": SITE.url + "/blog/" + slug, "url": SITE.url + "/blog/" + slug, }, ldBreadcrumb(crumbs), ], }); const others = Object.values(window.BLOG_POSTS).filter(x => x.slug !== slug).slice(0,3); return (
{p.paragraphs.map((para, i) => {para})}
{others.map((o, i) => (
{o.category}

{o.title}

{o.excerpt}

Read →
))}
); } Object.assign(window, { SubservicePage, IndustryPage, IndustriesIndexPage, WorkIndexPage, CaseStudyPage, BlogIndexPage, BlogPostPage });