/* eslint-disable no-undef */ /* TrustLensLanding.jsx — the Mytanah TrustLens hackathon pitch deck as one scrolling landing page. 10 sections, each framed like a deck slide, on the Mytanah token system (cream world / forest authority / earth accent). Depends on Primitives.jsx (C, Display, Eyebrow), TrustLensUI.jsx, HeroGlobe.jsx. */ const { useState, useEffect, useRef } = React; const APP_HREF = '/dashboard?from=intro'; /* ---- tiny line-icon set (kept simple per house rules) ---------------- */ const ic = (paths, vb = '0 0 24 24') => (p) => ( {paths} ); const I = { shield: ic(<>), eyeOff: ic(<>), scatter: ic(<>), pulse: ic(<>), search: ic(<>), scale: ic(<>), brain: ic(<>), layers: ic(<>), flag: ic(<>), bank: ic(<>), building: ic(<>), user: ic(<>), api: ic(<>), check: ic(<>), arrow: ic(<>), doc: ic(<>), trend: ic(<>), }; /* ---- shared section scaffolding -------------------------------------- */ const MAXW = 1180; const Slide = ({ id, dark, raised, children, style }) => (
{children}
); const Kicker = ({ n, track, dark }) => (
{n} / 11 {track}
); const H = ({ children, dark, size = 'clamp(30px, 4.4vw, 52px)', style }) => (

{children}

); const Lead = ({ children, dark, style }) => (

{children}

); const Panel = ({ children, dark, style, accent }) => (
{children}
); const IconBox = ({ Icon, dark, color = C.earth }) => (
); /* ===================================================================== */ /* NAV */ /* ===================================================================== */ const NavBar = () => { const [solid, setSolid] = useState(false); useEffect(() => { const onScroll = () => { const stage = document.getElementById('hero-stage'); const th = stage ? stage.offsetHeight - 140 : 80; setSolid(window.scrollY > th); }; window.addEventListener('scroll', onScroll, { passive: true }); onScroll(); return () => window.removeEventListener('scroll', onScroll); }, []); const link = (href, label) => ( e.currentTarget.style.color = solid ? C.deep : C.cream} onMouseLeave={e => e.currentTarget.style.color = solid ? C.mid : 'rgba(220,215,201,.7)'}>{label} ); return ( ); }; /* ===================================================================== */ /* 1 · HERO */ /* ===================================================================== */ const HeroContent = () => (
{/* calm ambient corner globe — the settled end-state */}
{/* legibility scrim */} ); /* The scroll-scrubbed intro: the sphere unrolls (ScrollGlobe) while the hero tilts up from 3D perspective (the fused ContainerScroll effect) and lands as the full landing view. */ const ScrollHero = () => { const titleRef = useRef(null); const cardRef = useRef(null); useEffect(() => { const clamp = (t, a = 0, b = 1) => (t < a ? a : t > b ? b : t); const smooth = t => t * t * (3 - 2 * t); const easeOut = t => 1 - Math.pow(1 - t, 3); let ticking = false; const apply = () => { ticking = false; const el = document.getElementById('hero-stage'); if (!el) return; const rect = el.getBoundingClientRect(); const runway = el.offsetHeight - window.innerHeight; const p = clamp(-rect.top / (runway || 1)); if (titleRef.current) { const o = 1 - smooth(clamp(p / 0.2)); titleRef.current.style.opacity = String(o); titleRef.current.style.transform = `translateY(${(-p * 150).toFixed(1)}px)`; titleRef.current.style.pointerEvents = o < 0.05 ? 'none' : 'auto'; } if (cardRef.current) { const cp = easeOut(clamp((p - 0.5) / 0.42)); const rot = (1 - cp) * 22; const sc = 0.9 + cp * 0.1; const ty = (1 - cp) * 70; const op = clamp((cp - 0.05) * 1.4); cardRef.current.style.transform = `translateY(${ty.toFixed(1)}px) scale(${sc.toFixed(3)}) rotateX(${rot.toFixed(2)}deg)`; cardRef.current.style.opacity = String(op); cardRef.current.style.pointerEvents = op > 0.92 ? 'auto' : 'none'; } }; const onScroll = () => { if (!ticking) { ticking = true; requestAnimationFrame(apply); } }; window.addEventListener('scroll', onScroll, { passive: true }); window.addEventListener('resize', onScroll); apply(); return () => { window.removeEventListener('scroll', onScroll); window.removeEventListener('resize', onScroll); }; }, []); return (
); }; const pillDark = { fontFamily: "'DM Sans',sans-serif", fontSize: 12, fontWeight: 600, letterSpacing: '.02em', color: C.deep, background: C.earthLight, padding: '7px 14px', borderRadius: 9999 }; const pillDarkGhost = { fontFamily: "'DM Sans',sans-serif", fontSize: 12, fontWeight: 600, letterSpacing: '.02em', color: 'rgba(220,215,201,.8)', border: '1px solid rgba(220,215,201,.28)', padding: '7px 14px', borderRadius: 9999 }; const ctaPrimary = { display: 'inline-flex', alignItems: 'center', gap: 8, textDecoration: 'none', background: C.earth, color: C.cream, padding: '15px 28px', borderRadius: 9999, fontFamily: "'DM Sans',sans-serif", fontSize: 15, fontWeight: 600, boxShadow: '0 14px 34px rgba(162,123,92,.4)' }; const ctaGhost = { display: 'inline-flex', alignItems: 'center', gap: 8, textDecoration: 'none', color: C.cream, padding: '15px 26px', borderRadius: 9999, fontFamily: "'DM Sans',sans-serif", fontSize: 15, fontWeight: 600, border: '1px solid rgba(220,215,201,.32)' }; /* ===================================================================== */ /* 2 · PROBLEM */ /* ===================================================================== */ const PROBLEMS = [ { Icon: I.eyeOff, title: 'Bait-and-switch listings', body: 'Agents post a unit far below market to bait enquiries, then claim it is “just sold” and steer you to a pricier one. The low price was never real.' }, { Icon: I.scatter, title: 'Price opacity', body: 'Asking prices routinely diverge from real transacted values — and a professional valuation costs RM800–RM2,500 and takes days.' }, { Icon: I.pulse, title: 'No sentiment or risk read', body: 'Buyer sentiment, demand and housing-cycle risk move prices, yet they are absent and unreadable in today’s property tools.' }, ]; const Problem = () => (
Property decisions are too expensive to get wrong. Across Malaysia, buyers negotiate blind — misled by bait listings and asking prices that have little to do with what actually transacted.
{PROBLEMS.map((p, i) => (
{p.title}

{p.body}

))}
{[['RM800–2,500', 'cost of one valuation'], ['3–5 days', 'typical turnaround'], ['0', 'sentiment signals in buyer tools']].map(([a, b], i) => (
{a}
{b}
))}
); /* ===================================================================== */ /* 2B · BAIT-AND-SWITCH — the problem, in focus */ /* ===================================================================== */ const bsCard = { background: 'rgba(255,255,255,.04)', border: '1px solid rgba(220,215,201,.14)', borderRadius: 14, padding: 20, display: 'flex', flexDirection: 'column' }; const StepTag = ({ n, label, color }) => (
{n} {label}
); const Bubble = ({ side, children }) => (
{children}
); const BaitSwitch = () => (
THE #1 TRICK Problem in focus
The price you saw was never real. A listing appears far below market. You enquire — and it is suddenly “just sold.” The agent pivots you to a pricier unit. The cheap price was only bait. Mytanah breaks the trick by showing the real transacted price — straight from NAPIC records — up front.
{/* 1 — the bait */}
Bait property listing example
RM1,980,000
Inter-terrace · SS2, Petaling Jaya
Below market · rare freehold
{/* 2 — the lie */}
Hi, is this terrace still available? So sorry — that one was sold over the weekend! But I have one two streets away at RM2,650,000 — still good value, want to view?
{/* 3 — the reveal */}
Real transacted price · NAPIC records
RM2,480,000
last sold Q3’24 · same street
The RM1.98M ad never transacted
); /* ===================================================================== */ /* 3 · SOLUTION */ /* ===================================================================== */ const CAPS = [ ['Real transaction price', 'The actual transacted price from open property data — not the asking price.'], ['Fair value range', 'Lower, central and upper estimate from live web research, not a static model.'], ['Bait-and-switch check', 'Flags listings priced far from real evidence so a fake low ad can’t fool you.'], ['Housing sentiment', 'Google Trends search behaviour as a demand proxy.'], ['Market-cycle risk', 'Upward, neutral or downward price-pressure read.'], ['Rental yield & ROI', 'LLM-sourced rents to estimate gross yield and return on investment.'], ]; const Solution = () => ( An AI trust layer for property transactions. Mytanah does not replace a professional valuer. An LLM researches the live web over open transaction data to deliver instant preliminary trust intelligence — so buyers, lenders and platforms know what to scrutinise before money moves.
{CAPS.map(([t, b], i) => (
{String(i + 1).padStart(2, '0')}
{t}

{b}

))}
); /* ===================================================================== */ /* 4 · DEMO FLOW */ /* ===================================================================== */ const STEPS = [ ['Enter the listing', 'Property attributes or a listing URL — type, size, scheme, asking price.'], ['AI researches the market', 'An LLM searches live listings and open transactions (Exa Search) for a fair-value range.'], ['Compare to real evidence', 'The asking price is matched against actual recent transactions nearby.'], ['Receive a trust label', 'One verdict, plus rental yield & ROI and the evidence behind it.'], ]; const Demo = () => ( From listing to trust score in seconds.
{STEPS.map(([t, b], i) => (
{i + 1} {i < 3 && }
{t}

{b}

))}
The five verdicts
{['Fair Price', 'Overpriced', 'Underpriced', 'Insufficient Data', 'High Risk'].map(l => ( ))}
); /* ===================================================================== */ /* 5 · RESEARCH ENGINE */ /* ===================================================================== */ const Engine = () => ( Built for the Malaysian market. Three live intelligence modules — web-researched valuation, search sentiment, and housing-cycle risk — fused into one trust output.
Live Valuation Engine

An LLM researches live listings and open transactions online via Exa Search for a value range — then sources rents to compute yield and ROI.

Housing Sentiment Index

Google Trends property-search behaviour becomes a real-time demand and sentiment proxy.

+18%
Housing Cycle Risk

Transaction volume, household debt, impaired loans, overhang, supply and sentiment → directional pressure.

{[['Down', C.down], ['Neutral', C.stable], ['Up', C.up]].map(([l, c], i) => (
{l}
))}
); /* ===================================================================== */ /* 6 · TRUST & FRAUD */ /* ===================================================================== */ const FLAGS = [ 'Bait-and-switch ads — a low price that “disappears” on enquiry', 'Listing prices far above real transaction evidence', 'Weak or thin comparable support', 'Data-sparse locations where confidence is low', 'Market conditions showing downward pressure', ]; const TrustFraud = () => (
Detect misleading prices before money is at risk. Mytanah shows the actual transacted price from open property data — so a bait listing priced to lure you can’t. It flags anomalies and weak evidence for review, human in the loop.
{FLAGS.map((f, i) => (
{f}
))}
{/* anomaly example card */}
Mont Kiara · Condominium
Kuala Lumpur · 1,140 sqft
Listing sits +20% above the upper estimate with only 2 thin comps. Flagged for human review.
); /* ===================================================================== */ /* 7 · WHO PAYS */ /* ===================================================================== */ const MODELS = [ { Icon: I.building, who: 'Property platforms', body: 'API for listing trust scores and price-anomaly detection at scale.', price: 'Usage-based per listing checked' }, { Icon: I.bank, who: 'Banks & lenders', body: 'SaaS dashboard for mortgage pre-screening and collateral monitoring.', price: 'Enterprise SaaS' }, { Icon: I.user, who: 'Agencies & agents', body: 'Monthly dashboard for pricing listings and advising clients.', price: 'RM99 / mo · RM499+ agency' }, { Icon: I.doc, who: 'Consumers', body: 'A paid property trust report before buying or negotiating.', price: 'RM19–RM49 / report' }, ]; /* ===================================================================== */ /* 6B · TARGET AUDIENCE — who it's for */ /* ===================================================================== */ const AUDIENCE = [ { tier: 'Primary end users', tone: C.earth, items: [ ['First-time homebuyers', 'Afraid of overpaying, scams and hidden risk.', 'Most emotional'], ['Home sellers', 'Price right instead of guessing from portal asks.'], ['Property investors', 'Fair value, downside risk, timing and rental ROI.'], ] }, { tier: 'Best-paying customers', tone: C.up, items: [ ['Property platforms', 'A listing trust-score API to flag weak prices.'], ['Banks & lenders', 'Fast collateral pre-screening before valuation.', 'Highest value'], ['Real estate agencies', 'Price listings and justify asks to clients.'], ['Valuation firms', 'Pre-screen and surface comparables faster.'], ] }, { tier: 'Strategic / institutional', tone: C.stable, items: [ ['Housing agencies', 'Affordability and market-risk monitoring.'], ['Urban planners', 'Market heat, overhang, district pressure.'], ['Developers', 'Where and when to launch, from sentiment & risk.'], ] }, ]; const Audience = () => (
AUDIENCE Who it's for
Everyone with money on the line. From the first-time buyer afraid of overpaying to the bank screening collateral — Mytanah serves the whole property decision chain across Malaysia.
{AUDIENCE.map((col, ci) => ( {col.tier} {col.items.map(([name, desc, tag], i) => (
{name} {tag && ( {tag} )}

{desc}

))}
))}
); const WhoPays = () => ( Trust infrastructure for the property economy. One trust engine, four buyers — from a single consumer report to platform-scale API checks.
{MODELS.map((m, i) => (
{m.who}

{m.body}

{m.price}
))}

Pricing shown as indicative hackathon placeholders.

); /* ===================================================================== */ /* 8 · COMPETITIVE ADVANTAGE */ /* ===================================================================== */ const EDGE = ['Real transacted price, not asking', 'Bait-and-switch detection', 'Sentiment signal', 'Housing-cycle risk', 'Rental yield & ROI', 'Open data: nationwide Malaysia coverage']; const Advantage = () => (
More than an AVM. Most tools stop at an estimated price. Mytanah explains whether that price can be trusted — by stacking six signals into one verdict.
Typical AVM
Estimated price only
Mytanah
{EDGE.map((e, i) => (
{e}
))}
); /* ===================================================================== */ /* 9 · COMPETITOR ANALYSIS */ /* ===================================================================== */ const COMP_ROWS = [ { label: 'AI-powered property valuation', vals: [true, false, false], highlight: true }, { label: 'Real transaction data (NAPIC)', vals: [true, true, false] }, { label: 'ROI & rental yield calculator', vals: [true, false, false], highlight: true }, { label: 'Market cycle indicator', vals: [true, false, false], highlight: true }, { label: 'Buyer sentiment index', vals: [true, false, false] }, { label: 'Bait listing detection', vals: [true, false, false] }, { label: 'Trust score verdict', vals: [true, false, false] }, ]; const DIFFS = [ { n: '01', Icon: I.brain, title: 'ML valuation, not just history', body: 'XGBoost, Random Forest & FT-Transformer trained on 400K+ real transactions produce a calibrated price estimate. PropertyGuru and ibiik surface past sales — you still have to decide what the number means.', }, { n: '02', Icon: I.trend, title: 'ROI calculator with real rental data', body: 'Live AI-sourced rental comps convert estimated rent into gross yield and return on investment. No other Malaysian portal offers an end-to-end ROI view — they show listings, not returns.', }, { n: '03', Icon: I.pulse, title: 'Market cycle & demand intelligence', body: "Mytanah reads WHERE Malaysia's property market sits in its cycle today — rising, stable, or falling — and overlays real-time buyer demand from Google Trends. Knowing the price is only half the picture; knowing the timing is the other half.", }, ]; const CompetitorAnalysis = () => ( What others show you. What Mytanah tells you. Property portals show listings. Transaction tools show history. Mytanah is the only platform that fuses ML valuation, ROI intelligence, and market timing signals into a single trust verdict. {/* 3 differentiators */}
{DIFFS.map(({ n, Icon, title, body }, i) => (
{n}
{title}

{body}

))}
{/* comparison table */}
{/* header */}
{[['Mytanah', true], ['PropertyGuru', false], ['ibiik', false]].map(([name, us], i) => (
{name} {us && ( Us )}
))}
{/* rows */} {COMP_ROWS.map(({ label, vals, highlight }, ri) => (
{highlight && } {label}
{vals.map((v, vi) => (
{v ? : }
))}
))}
); /* ===================================================================== */ /* 10 · HACKATHON BUILD */ /* ===================================================================== */ const MVP = ['Landing page pitch deck', 'Property input form', 'Mock trust-score dashboard', 'Comparable transactions table', 'Sentiment, risk & ROI widgets', 'AI-generated explanation panel', 'B2B pricing section']; const Build = () => (
What we can build this weekend. A working frontend prototype on mock data — every screen real, every number plausible, no backend required.
{MVP.map((m, i) => (
{m}
))}
Future: deepen the Exa-powered valuation, rental-yield and risk engine, with broader open-transaction coverage across Malaysia.
); /* ===================================================================== */ /* 10 · CLOSING */ /* ===================================================================== */ const Closing = () => (

Fairer property decisions
start with trust.

Mytanah helps buyers, platforms, and lenders across Malaysia verify whether a property price is fair, explainable, and backed by real transaction evidence — before a high-stakes deal.

Mytanah
Live valuation via web research (Exa Search) over open transaction data across Malaysia. Demo uses sample data.
); /* ===================================================================== */ const TrustLensLanding = () => (
); Object.assign(window, { TrustLensLanding });