);
/* -------------------------------------------------------------- what we build */
const WhatWeBuild = ({ c }) => (
{c.title}
{c.intro}
{c.items.map((it, i) => (
{it.title}
{it.body}
))}
);
/* --------------------------------------------------------------- how it works */
const HowItWorks = ({ c }) => (
{c.title}
{c.intro}
{c.steps.map((s, i) => (
{i + 1}
{s.title}
{s.body}
))}
);
/* ------------------------------------------------- market pulse (scraped data) */
const MarketPulse = ({ data }) => {
// Hidden until the scraper has produced real data — no placeholder numbers.
if (!data || !(data.stats || []).length) return null;
return (
Market pulse
Updated automatically from the public ClinicalTrials.gov registry — no manual editing.
{form.newsletter
? 'You are on the list for the digital-health trials update, and we will reply to anything you asked about.'
: 'We will get back to you shortly.'}
) : (
)}
);
};
const Footer = () => (
);
/* -------------------------------------------------------------------- app */
const App = () => {
const [content, setContent] = useState(null);
const [intel, setIntel] = useState(null);
useEffect(() => {
// cache: 'no-cache' revalidates with the server on every load, so a weekly
// data refresh shows up immediately instead of serving a stale cached copy.
// The server still answers 304 when nothing changed, so this costs nothing.
const opts = { cache: 'no-cache' };
fetch('data/site-content.json', opts).then(r => r.json()).then(setContent).catch(() => {});
fetch('data/market-intel.json', opts).then(r => r.json()).then(setIntel).catch(() => {});
}, []);
if (!content) return null;
return (
<>
>
);
};
ReactDOM.createRoot(document.getElementById('root')).render();