// Luxury "How it works" — stacking sticky cards with animated icons. // Each card sticks at the top, then the next slides up over it as you scroll. const STEPS = [ { n: '01', t: '00:00', eyebrow: 'Step one · Connect', h: <>Connect your storage., p: 'Connect any major cloud storage — or drag a folder in. We index in place. Your documents never leave your tenant, never train a model, never travel between regions.', points: ['One-click connectors to 12 storage backends', 'Index lives in your region', 'Zero document copies — read-only by default'], accent: '#1f3a30', icon: 'connect', }, { n: '02', t: '00:08', eyebrow: 'Step two · Extract', h: <>The first document indexes in 1.2s., p: 'Our compliance-tuned AI reads each contract for parties, dates, clauses, signatures, and obligations. Everything is indexed into a domain-specific knowledge base for compliance-aware search. By the time you refill coffee, the first hundred are searchable.', points: ['Extracts 47 entity types per document automatically', '1.2s median time to indexed & searchable', 'Compliance-specific confidence grading — flagged below 0.85'], accent: '#14110e', icon: 'extract', }, { n: '03', t: '00:42', eyebrow: 'Step three · Score', h: <>Every vendor, scored., p: 'Each vendor is scored from twelve weighted factors — coverage, renewals, audits, and more. AI detects risk impact and compliance gaps automatically. Threshold alerts wire to chat, email, or webhook.', points: ['0–100 composite score, drillable to each factor', 'AI-driven risk impact detection, live as documents change', 'Routes to chat, email, or any webhook'], accent: '#a8854a', icon: 'score', }, { n: '04', t: '01:30', eyebrow: 'Step four · Build', h: <>The graph builds itself., p: 'A live knowledge graph links entities to documents, documents to vendors, vendors to regulations. Compliance lineage is mapped automatically. Pull one node — see the full picture. Diff against last quarter.', points: ['447 nodes / 1,128 edges in a typical portfolio', 'Time-travel diff against any prior snapshot', 'Exports to JSON, RDF, or visual report'], accent: '#5a8470', icon: 'graph', }, { n: '05', t: '04:00', eyebrow: 'Step five · Ask', h: <>Ask the Compliance Copilot anything., p: 'Natural-language Q&A grounded in your documents and a compliance-specific knowledge base. Understands gaps, cites source clauses, and refuses when evidence is thin. The afternoon you started — you are done.', points: ['Cited answers in 1.4s median', 'Refuses gracefully when sources are thin', 'Saves frequent queries as named reports'], accent: '#7d2e3a', icon: 'copilot', }, ]; // =========================================================================== // Animated icons — each plays when its card is the "active" sticky. // =========================================================================== const HiwIcon = ({ kind, live }) => { const cls = `ccl-hiw-icon ccl-hiw-icon-${kind} ${live ? 'live' : ''}`; if (kind === 'connect') { return ( {/* Cloud sources */} {[ { x: 30, y: 30, l: 'Cloud' }, { x: 30, y: 90, l: 'SaaS' }, { x: 30, y: 150, l: 'Local' }, ].map((s, i) => ( {s.l.toUpperCase()} ))} {/* Wires */} {/* Hub */} cc {/* Pulses traveling inward */} {live && ( <> )} ); } if (kind === 'extract') { return ( {/* Document */} MSA · 0418 {/* Body lines */} {[58, 70, 82, 94, 106, 118, 130, 142, 154].map((y, i) => { const w = [104, 96, 88, 100, 84, 96, 70, 92, 76][i]; const lit = [1, 3, 6].includes(i); return ( ); })} {/* Scan bar */} {/* Output chips */} {[ { y: 50, l: 'PARTY · Harbor', d: '900ms', c: '#1f3a30' }, { y: 80, l: 'TERM · 36 mo', d: '1180ms', c: '#1f3a30' }, { y: 110, l: 'EXPIRES · 09/26', d: '1460ms', c: '#1f3a30' }, ].map(c => ( {c.l} ))} ); } if (kind === 'score') { const r = 64, c = 2 * Math.PI * r; return ( {/* Tick marks */} {Array.from({length: 24}).map((_, i) => { const a = (i / 24) * Math.PI * 2 - Math.PI / 2; const x1 = Math.cos(a) * 76, y1 = Math.sin(a) * 76; const x2 = Math.cos(a) * 82, y2 = Math.sin(a) * 82; return ; })} {/* Background ring */} {/* Progress ring — drawn via stroke-dashoffset */} {/* Score */} 86 VENDOR SCORE {/* Factor labels */} {[ { x: 14, y: 36, l: 'Coverage' }, { x: 178, y: 36, l: 'Renewals' }, { x: 14, y: 174, l: 'Audits' }, { x: 178, y: 174, l: 'Doc gaps' }, ].map((f, i) => ( {f.l.toUpperCase()} ))} ); } if (kind === 'graph') { const nodes = [ { x: 120, y: 100, r: 16, big: true }, { x: 50, y: 40, r: 8 }, { x: 190, y: 40, r: 8 }, { x: 50, y: 160, r: 8 }, { x: 190, y: 160, r: 8 }, { x: 30, y: 100, r: 5 }, { x: 210, y: 100, r: 5 }, { x: 120, y: 20, r: 5 }, { x: 120, y: 180, r: 5 }, ]; const edges = nodes.slice(1).map(n => ({ x: n.x, y: n.y })); return ( {edges.map((n, i) => ( ))} {nodes.map((n, i) => ( {n.big && ( )} ))} {live && ( )} ); } if (kind === 'copilot') { return ( {/* User bubble */} Show overdue audits ↗ YOU {/* Thinking dots */} {/* Answer bubble */} COMPLYCHIP · 1.4S · 7 SOURCES 3 audits past due: Harbor · 12d · OSHA University · 18d · DPA ); } return null; }; // =========================================================================== // Stacking sticky cards section // =========================================================================== const LHowItWorks = () => { const sectionRef = React.useRef(null); const [active, setActive] = React.useState(0); React.useEffect(() => { let raf = 0; const update = () => { raf = 0; const cards = sectionRef.current?.querySelectorAll('.ccl-hiw-card'); if (!cards || !cards.length) return; const vh = window.innerHeight; // The card whose top is closest to (but past) 30% of the viewport is "active" let best = 0; let bestDist = Infinity; cards.forEach((c, i) => { const r = c.getBoundingClientRect(); const dist = Math.abs(r.top - vh * 0.30); if (r.top < vh * 0.55 && dist < bestDist) { bestDist = dist; best = i; } }); setActive(best); }; const onScroll = () => { if (!raf) raf = requestAnimationFrame(update); }; window.addEventListener('scroll', onScroll, { passive: true }); window.addEventListener('resize', onScroll); update(); return () => { window.removeEventListener('scroll', onScroll); window.removeEventListener('resize', onScroll); cancelAnimationFrame(raf); }; }, []); return (
How it works

From folder of PDFs
to indexed portfolio, in one afternoon.

No migration team. No six-week implementation. Connect storage, point at your folders, watch the graph build itself.

{/* Left rail — index */} {/* Stacking cards */}
{STEPS.map((s, i) => (
{s.n} T+{s.t}
{s.eyebrow}

{s.h}

{s.p}

    {s.points.map(pt => (
  • {pt}
  • ))}
))} {/* Spacer so the last card has runout */}
); }; window.LHowItWorks = LHowItWorks;