/* global React */ const { useState, useEffect, useRef } = React; // ---------- TWEAK DEFAULTS (shared, mirrored across pages) ---------- const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{ "accent": "#2A3FA0", "dark": false, "showKeenDigital": true }/*EDITMODE-END*/; function useTheme(tweaks) { useEffect(() => { const root = document.documentElement; root.style.setProperty('--brand', tweaks.accent); root.style.setProperty('--brand-soft', tweaks.accent + '22'); root.style.setProperty('--brand-line', tweaks.accent + '55'); root.dataset.theme = tweaks.dark ? 'dark' : 'light'; }, [tweaks.accent, tweaks.dark]); } function useInView(threshold = 0.15) { const ref = useRef(null); const [inView, setInView] = useState(false); useEffect(() => { if (!ref.current) return; const obs = new IntersectionObserver(([e]) => { if (e.isIntersecting) { setInView(true); obs.disconnect(); } }, { threshold }); obs.observe(ref.current); return () => obs.disconnect(); }, []); return [ref, inView]; } function TopBar({ active }) { const links = [ ['Platform', 'Platform.html'], ['Ordering', 'Ordering.html'], ['Intelligence', 'Intelligence.html'], ['Operations', 'Operations.html'], ['Launcher', 'Launcher.html'], ['White-label', 'WhiteLabel.html'], ['Why us', 'WhyUs.html'], ]; return (
keenFRANCHISE
Sign in Book a demo
); } function PageHeader({ eyebrow, title, lede, meta, actions }) { return (
{eyebrow} {meta && {meta}}

{title}

{lede &&

{lede}

} {actions &&
{actions}
}
); } function FeatureBlock({ eyebrow, title, lede, points, art, reverse }) { const [ref, inView] = useInView(0.2); return (
{eyebrow}

{title}

{lede &&

{lede}

} {points && (
    {points.map(([k, v]) => (
  • {k}{v}
  • ))}
)}
{art}
); } function Benefit({ kw, children }) { return (
{kw}

{children}

); } function CTABand({ title, lede, primary, secondary }) { return (

{title}

{lede &&

{lede}

}
{primary?.label || 'Book a demo'} {secondary && {secondary.label}}
); } function Footer({ tweaks }) { return ( ); } function SiteTweaks({ tweaks, setTweak }) { return ( setTweak('dark', v)} /> setTweak('accent', v)} />
{[ ['#2A3FA0', 'Indigo ink'], ['#1F4D3A', 'Deep forest'], ['#0F3D6E', 'Deep ocean'], ['#6E2E3E', 'Bordeaux'], ['#7A5A2E', 'Bronze'], ['#1A1A1A', 'Charcoal'], ].map(([c, name]) => (
setTweak('showKeenDigital', v)} />
); } // Expose globals so per-page scripts can use them Object.assign(window, { KF: { TWEAK_DEFAULTS, useTheme, useInView, TopBar, PageHeader, FeatureBlock, Benefit, CTABand, Footer, SiteTweaks }, });