/* ============================================================
NeuralScout — Page sections (Nav, Hero, About, CTA, Footer)
============================================================ */
function Nav({ overlay = false }) {
const navStyle = overlay
? { ...pageStyles.nav, ...pageStyles.navOverlay, position: 'fixed', left: 0, right: 0, top: 0 }
: pageStyles.nav;
const linkStyle = overlay
? { ...pageStyles.navLink, ...pageStyles.navLinkOverlay }
: pageStyles.navLink;
return (
{[
['Product', 'index.html#product'],
['How it works', 'index.html#how'],
['Use cases', 'index.html#use-cases'],
['Pricing', 'Pricing.html'],
['Docs', '#'],
].map(([l, href]) => (
{l}
))}
);
}
function ThemeToggle({ overlay = false }) {
const [theme, setTheme] = React.useState(() => {
if (typeof document === 'undefined') return 'dark';
return document.documentElement.getAttribute('data-theme') || 'dark';
});
React.useEffect(() => {
const sync = () => setTheme(document.documentElement.getAttribute('data-theme') || 'dark');
window.addEventListener('ns-theme-change', sync);
return () => window.removeEventListener('ns-theme-change', sync);
}, []);
const toggle = () => {
const next = theme === 'light' ? 'dark' : 'light';
document.documentElement.setAttribute('data-theme', next);
try { localStorage.setItem('ns-theme', next); } catch(e) {}
setTheme(next);
window.dispatchEvent(new CustomEvent('ns-theme-change', { detail: { theme: next }}));
};
const isLight = theme === 'light';
const borderColor = overlay ? 'rgba(255,255,255,0.25)' : 'var(--ns-line-2)';
const color = overlay ? 'rgba(255,255,255,0.85)' : 'var(--ns-fg-dim)';
return (
{ e.currentTarget.style.color = overlay ? '#fff' : 'var(--ns-fg)'; e.currentTarget.style.borderColor = overlay ? 'rgba(255,255,255,0.5)' : 'var(--ns-fg-dim)'; }}
onMouseLeave={e => { e.currentTarget.style.color = color; e.currentTarget.style.borderColor = borderColor; }}
>
{isLight ? (
// moon icon for "click to go dark"
) : (
// sun icon for "click to go light"
)}
);
}
const LOGO_SRC = 'assets/logos/logo.png';
function Logo({ height = 32 }) {
return (
);
}
function Hero() {
return (
Real-time video analytics · v2.1
Every camera, watching.
Every frame, understood.
NeuralScout turns any 24/7 RTSP stream into live counts, dwell times, faces,
plates, and demographics — plus anything you can describe in plain English.
{[
{ v:'12ms', l:'median inference' },
{ v:'99.97%', l:'uptime SLA' },
{ v:'30 fps', l:'per stream' },
].map((s, i) => (
))}
{/* Logo row */}
DEPLOYED BY OPS & SECURITY TEAMS AT
{['NORTHWARE', 'Meridian', 'CLARIFY.io', 'Portside', 'SIGMA+', 'Yardwell'].map(l => (
{l}
))}
);
}
function SectionHeader({ eyebrow, title, sub, align = 'center' }) {
return (
{eyebrow}
{title}
{sub &&
{sub}
}
);
}
function FeaturesSection() {
return (
Six features. One feed. Zero new hardware. >}
sub="Stop re-watching footage. NeuralScout extracts the signal from every second of every camera — continuously."
/>
);
}
function DashboardSection() {
return (
One place for every camera, zone, and question. >}
sub="Group cameras by site, compare zones side-by-side, slice by time. Set alerts. Share reports. Built for ops, security, and retail teams."
/>
);
}
function TimelineSection() {
return (
From camera to chart in five steps. >}
sub="No models to train. No cameras to replace. Point us at your RTSP feed — we do the rest."
/>
);
}
function StatsSection() {
const now = useTick(100);
const t = (now % 4000) / 4000;
return (
{/* bg dots */}
Running right now, across thousands of cameras. >}
/>
{[
{ v: (12400 + Math.floor(t*80)).toLocaleString(), l:'frames analyzed / second' },
{ v: '1,340', l:'cameras in production' },
{ v: '2.1B', l:'events indexed to date' },
{ v: '98.7%', l:'detection accuracy' },
].map((s, i) => (
))}
);
}
function TestimonialSection() {
return (
{/* stylized portrait */}
Customer · Portside Logistics
"We replaced three dashboards and two headcount spreadsheets with NeuralScout.
The VLM prompt feature alone caught a safety violation in week one."
Rhea Okonkwo
VP Operations · Portside
);
}
function CTASection() {
return (
Ready when you are
Plug in your feed.
See insights in 60 seconds.
Free 14-day trial. No hardware changes. Cancel anytime.
{/* Decorative feed */}
);
}
function Footer() {
return (
);
}
const pageStyles = {
nav: {
position:'sticky', top: 0, zIndex: 40,
background:'var(--ns-nav-bg)',
backdropFilter:'blur(12px)',
borderBottom:'1px solid var(--ns-line)',
},
navOverlay: {
background:'rgba(0,0,0,0.38)',
backdropFilter:'blur(16px)',
borderBottom:'1px solid rgba(255,255,255,0.08)',
color:'#fff',
},
navLinkOverlay: {
color:'rgba(255,255,255,0.82)',
},
navInner: {
maxWidth: 1320, margin:'0 auto',
padding: '14px var(--ns-pg)',
display:'flex', justifyContent:'space-between', alignItems:'center', gap: 24,
},
navLinks: {
display:'flex', gap: 22, alignItems:'center',
},
navLink: {
color:'var(--ns-fg-dim)', fontSize: 13.5, textDecoration:'none',
transition:'color .2s',
whiteSpace:'nowrap',
},
hero: {
position:'relative', paddingTop: 60, paddingBottom: 80,
borderBottom:'1px solid var(--ns-line)',
overflow:'hidden',
},
heroInner: {
maxWidth: 1320, margin:'0 auto',
padding: '0 var(--ns-pg)',
display:'grid', gridTemplateColumns: '1fr 1.2fr', gap: 60,
alignItems:'center',
},
heroCopy: { maxWidth: 540 },
h1: {
fontFamily:'var(--ns-display)',
fontSize: 'clamp(40px, 5.5vw, 72px)',
fontWeight: 500, lineHeight: 1.02,
letterSpacing:'-0.03em',
margin:'0 0 24px',
textWrap:'balance',
},
heroSub: {
fontSize: 17, lineHeight: 1.55,
color:'var(--ns-fg-dim)', margin: 0,
textWrap:'pretty',
},
heroFeed: { width: '100%' },
logoRow: {
maxWidth: 1320, margin:'0 auto', padding:'80px var(--ns-pg) 0',
display:'flex', flexDirection:'column', alignItems:'center', gap: 24,
},
logoStrip: {
display:'flex', gap: 48, alignItems:'center', flexWrap:'wrap', justifyContent:'center',
},
section: {
paddingTop: 'var(--ns-section)',
paddingBottom: 'var(--ns-section)',
},
sectionInner: {
maxWidth: 1320, margin:'0 auto',
padding: '0 var(--ns-pg)',
},
h2: {
fontFamily:'var(--ns-display)',
fontSize: 'clamp(32px, 4vw, 56px)',
fontWeight: 500, lineHeight: 1.05,
letterSpacing:'-0.02em',
margin:'0 0 20px',
textWrap:'balance',
},
sectionSub: {
fontSize: 17, lineHeight: 1.55,
color:'var(--ns-fg-dim)', margin: 0,
textWrap:'pretty',
},
featureGrid: {
display:'grid', gridTemplateColumns:'repeat(3, 1fr)', gap: 16,
},
statsWrap: {
position:'relative', padding: '60px 40px',
border:'1px solid var(--ns-line)',
borderRadius:'var(--ns-r-4)',
background:'radial-gradient(ellipse at 50% 0%, var(--ns-accent-soft), transparent 55%), var(--ns-bg-1)',
overflow:'hidden',
},
statsGrid: {
display:'grid', gridTemplateColumns:'repeat(4, 1fr)', gap: 1,
background:'var(--ns-line)', border:'1px solid var(--ns-line)',
},
statCell: {
background:'var(--ns-bg-1)',
padding:'32px 24px',
textAlign:'center',
},
statValue: {
fontFamily:'var(--ns-display)', fontSize: 'clamp(32px, 4vw, 52px)',
fontWeight: 500, letterSpacing:'-0.02em',
color:'var(--ns-fg)', fontVariantNumeric:'tabular-nums',
lineHeight: 1,
},
statLabel: {
fontFamily:'var(--ns-mono)', fontSize: 11,
color:'var(--ns-fg-dimmer)', letterSpacing:'0.1em', textTransform:'uppercase',
marginTop: 12,
},
testimonialCard: {
display:'grid', gridTemplateColumns: '160px 1fr', gap: 32,
padding: 40,
border:'1px solid var(--ns-line)',
borderRadius:'var(--ns-r-4)',
background:'var(--ns-bg-1)',
alignItems:'center',
},
testimonialAvatar: {
width: 160, height: 160,
background:'var(--ns-bg-2)',
border:'1px solid var(--ns-line)',
overflow:'hidden',
borderRadius: 8,
},
quote: {
fontFamily:'var(--ns-display)',
fontSize: 'clamp(22px, 2.3vw, 30px)',
lineHeight: 1.35, margin: 0,
letterSpacing:'-0.01em',
color:'var(--ns-fg)',
textWrap:'pretty',
fontWeight: 400,
},
ctaCard: {
position:'relative', overflow:'hidden',
border:'1px solid var(--ns-line)',
borderRadius:'var(--ns-r-4)',
background:'var(--ns-bg-1)',
padding: 'clamp(40px, 5vw, 72px)',
display:'grid', gridTemplateColumns:'1fr 240px', gap: 40, alignItems:'center',
},
ctaDecor: {
position:'relative', aspectRatio:'1/1', width: 240,
border:'1px solid var(--ns-line-2)',
overflow:'hidden',
},
footer: {
borderTop:'1px solid var(--ns-line)',
padding:'72px 0 40px',
background:'var(--ns-bg-1)',
},
footerGrid: {
display:'grid',
gridTemplateColumns:'1.4fr 1fr 1fr 1fr',
gap: 40,
marginBottom: 64,
},
footerBottom: {
borderTop:'1px solid var(--ns-line)',
paddingTop: 24,
display:'flex', justifyContent:'space-between', alignItems:'center',
flexWrap:'wrap', gap: 12,
},
};
Object.assign(window, {
Nav, ThemeToggle, Hero, FeaturesSection, DashboardSection, TimelineSection,
StatsSection, TestimonialSection, CTASection, Footer, SectionHeader, Logo,
});