--- a/source/pages/pages.py	2026-10-03 03:26:05.290354495 +0000
+++ b/source/pages/pages.py	2026-10-03 03:28:30.139134487 +0000
@@ -70,8 +70,8 @@
 /* dark band */
 .dark{background:#050a1a;color:#fff;overflow:hidden}
 .dark .h2{color:#fff}.dark .lead{color:rgba(255,255,255,.72)}
-.dark::before{content:"";position:absolute;width:60vw;height:60vw;right:-10vw;top:-20vw;border-radius:50%;background:radial-gradient(closest-side,rgba(47,107,255,.35),transparent);filter:blur(40px);animation:drift 24s ease-in-out infinite alternate}
-.dark::after{content:"";position:absolute;width:44vw;height:44vw;left:-12vw;bottom:-18vw;border-radius:50%;background:radial-gradient(closest-side,rgba(138,125,255,.28),transparent);filter:blur(40px);animation:drift 30s ease-in-out infinite alternate-reverse}
+section.dark::before{content:"";position:absolute;width:60vw;height:60vw;right:-10vw;top:-20vw;border-radius:50%;background:radial-gradient(closest-side,rgba(47,107,255,.35),transparent);filter:blur(40px);animation:drift 24s ease-in-out infinite alternate}
+section.dark::after{content:"";position:absolute;width:44vw;height:44vw;left:-12vw;bottom:-18vw;border-radius:50%;background:radial-gradient(closest-side,rgba(138,125,255,.28),transparent);filter:blur(40px);animation:drift 30s ease-in-out infinite alternate-reverse}
 @keyframes drift{to{transform:translate(-6vw,6vh) scale(1.12)}}
 .dark .in{position:relative;z-index:1}
 .gcard{padding:26px;border-radius:22px;background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.12);backdrop-filter:blur(14px)}
@@ -79,6 +79,7 @@
 /* forms */
 .form{padding:40px;border-radius:30px;background:#fff;box-shadow:inset 0 0 0 1px var(--line),0 50px 100px -60px rgba(11,21,48,.45)}
 .frow{display:grid;grid-template-columns:1fr 1fr;gap:16px}.frow+.frow,.ff+.ff,.frow+.ff,.ff+.frow{margin-top:16px}
+.frow>.ff+.ff{margin-top:0}
 .ff label{display:block;margin-bottom:7px;font:500 13px "Inter",system-ui,sans-serif;color:var(--ink2)}.ff label i{color:#d6453d;font-style:normal}
 .ff input,.ff select,.ff textarea{width:100%;height:52px;padding:0 16px;border-radius:14px;border:1px solid #dfe5f0;background:#fbfcfe;font:400 15.5px "Inter",system-ui,sans-serif;color:var(--ink);outline:none;transition:border-color .3s,box-shadow .3s,background .3s;appearance:none}
 .ff select{background-image:linear-gradient(45deg,transparent 50%,#7b86a0 50%),linear-gradient(135deg,#7b86a0 50%,transparent 50%);background-position:calc(100% - 22px) 23px,calc(100% - 17px) 23px;background-size:5px 5px;background-repeat:no-repeat}
@@ -137,6 +138,7 @@
 const io=new IntersectionObserver(es=>es.forEach(e=>{if(e.isIntersecting){e.target.classList.add('in');io.unobserve(e.target);}}),{threshold:.15});
 document.querySelectorAll('.rv').forEach(el=>io.observe(el));
 document.querySelectorAll('.lx-store').forEach(a=>a.addEventListener('click',e=>e.preventDefault()));
+document.querySelectorAll('[data-ai-yes]').forEach(a=>a.addEventListener('click',()=>{const r=document.querySelector('input[name=ai_interest][value=yes]');if(r)r.checked=true;}));
 /* forms: POST to the form's action (Laravel route); in the preview there is no server, so the thank-you state is shown */
 document.querySelectorAll('form[data-ajax]').forEach(f=>f.addEventListener('submit',async e=>{e.preventDefault();
   if(!f.reportValidity())return;const box=f.closest('.form'),btn=f.querySelector('button[type=submit]');btn.disabled=true;btn.textContent='Sending…';
@@ -252,11 +254,22 @@
    <img class="ph4-frame" src="{M['img']['phone3d']}" alt="" aria-hidden="true"></div><i class="ph4-glow"></i></div>
 </div></section>
 
-<section class="pad dark" id="ai"><div class="in ai-in">
- <div class="rv"><div class="eyebrow light">Custom AI for partners</div><h2 class="h2">AI built around<br><em {GRAD}>your business.</em></h2>
-  <p class="lead">We build customised AI solutions for PropertyLab partners: less admin, faster replies and more time for the work only you can do.</p>
-  <ul class="feat light"><li><b>AI enquiry assistant</b><span>Answers your enquiries around the clock in English, Chinese and Malay.</span></li><li><b>Automated follow-ups</b><span>Timely, personal messages on WhatsApp, email and LINE.</span></li><li><b>Proposals in minutes</b><span>Quotes, listings and proposals drafted from your own templates.</span></li><li><b>Business dashboard</b><span>Your pipeline and performance in one clear view.</span></li></ul></div>
- <div class="rv ai-img"><img src="{M['img']['pt-ai']}" alt="AI data visualised above a laptop"></div>
+<section class="pad dark" id="ai"><div class="in">
+ <div class="ai-head rv"><div><div class="eyebrow light">Custom AI for partners</div><h2 class="h2">AI built around<br><em {GRAD}>your business.</em></h2></div>
+  <div><p class="lead">We build customised AI solutions for PropertyLab partners: less admin, faster replies and more time for the work only you can do.</p>
+   <div class="ai-acts"><a class="btn white" href="#apply" data-ai-yes>Talk to us about custom AI <span aria-hidden="true">→</span></a></div></div></div>
+ <div class="ai-body mt">
+  <div class="ai-vis rv"><img src="{M['img']['pt-ai']}" alt="AI data visualised above a laptop">
+   <div class="ai-chat" aria-hidden="true"><div class="c-top"><span><i></i>AI enquiry assistant</span><span>2:14 am</span></div>
+    <div class="c-q">Can you quote a full renovation for a 2&#8209;bed, 649&nbsp;sq&nbsp;ft?</div>
+    <div class="c-a">Yes. I have drafted a quote from your template. Shall I book a site visit for Saturday?</div>
+    <div class="c-lang"><em>English</em><em>中文</em><em>Bahasa Melayu</em></div></div></div>
+  <ul class="ai-cards">
+   <li class="rv">{ic(IC['msg'])}<h3>AI enquiry assistant</h3><p>Answers your enquiries around the clock in English, Chinese and Malay.</p></li>
+   <li class="rv">{ic(IC['mail'])}<h3>Automated follow&#8209;ups</h3><p>Timely, personal messages on WhatsApp, email and LINE.</p></li>
+   <li class="rv">{ic(IC['doc'])}<h3>Proposals in minutes</h3><p>Quotes, listings and proposals drafted from your own templates.</p></li>
+   <li class="rv">{ic(IC['chart'])}<h3>Business dashboard</h3><p>Your pipeline and performance in one clear view.</p></li>
+  </ul></div>
 </div></section>
 
 <section class="pad" id="apply" style="background:var(--bg)"><div class="in apply-in">
@@ -335,16 +348,36 @@
 .s-tab{position:absolute;left:10px;right:10px;bottom:10px;height:70px;display:flex;justify-content:space-around;align-items:center;background:#fff;border-radius:26px;box-shadow:0 -6px 20px -12px rgba(15,27,51,.25);font-size:18px;color:#6b7690}
 .s-tab span{position:relative;display:flex;flex-direction:column;align-items:center;gap:2px;padding:6px 10px;border-radius:16px}.s-tab small{font-size:11px}.s-tab .on{color:#2f6bff;background:#e6efff}
 .s-tab .msg i{position:absolute;top:-4px;right:2px;font-style:normal;font-size:10px;font-weight:700;color:#fff;background:#d6453d;border-radius:999px;padding:2px 6px}
-.ai-in{display:grid;grid-template-columns:1fr 1fr;gap:60px;align-items:center}.ai-img img{border-radius:28px;box-shadow:0 60px 100px -50px rgba(0,0,0,.8)}
+/* the reveal script adds class "in", which is also the container class (auto margins + side padding): undo it here */
+.ai-head,.ai-vis,.ai-cards li{margin:0;max-width:none}.ai-head,.ai-vis{padding:0}
+.ai-head{display:grid;grid-template-columns:1.15fr .85fr;gap:64px;align-items:end}.ai-head .lead{margin:0}.ai-acts{margin-top:28px}
+.ai-acts .btn span{transition:transform .3s}.ai-acts .btn:hover span{transform:translateX(4px)}
+.ai-body{display:grid;grid-template-columns:.95fr 1.05fr;gap:20px;align-items:stretch}
+.ai-vis{position:relative;min-height:460px;border-radius:28px;overflow:hidden;border:1px solid rgba(255,255,255,.1);box-shadow:0 60px 100px -50px rgba(0,0,0,.8)}
+.ai-vis img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
+.ai-vis::after{content:"";position:absolute;inset:0;background:linear-gradient(180deg,transparent 35%,rgba(5,10,26,.8))}
+.ai-chat{position:absolute;z-index:1;left:22px;right:22px;bottom:22px;max-width:380px;padding:18px;border-radius:22px;background:rgba(9,16,38,.86);border:1px solid rgba(255,255,255,.14);box-shadow:0 30px 60px -30px rgba(0,0,0,.8);font-size:14px;line-height:1.5;color:#fff}
+.c-top{display:flex;justify-content:space-between;align-items:center;font:500 11px "Sora",system-ui,sans-serif;letter-spacing:.16em;text-transform:uppercase;color:rgba(255,255,255,.62)}
+.c-top span:first-child{display:flex;align-items:center;gap:8px;color:#fff}.c-top i{width:7px;height:7px;border-radius:50%;background:#3ddc97;box-shadow:0 0 0 4px rgba(61,220,151,.18)}
+.c-q{margin:14px 0 0 auto;max-width:86%;padding:10px 14px;border-radius:16px 16px 4px 16px;background:rgba(255,255,255,.12)}
+.c-a{margin-top:10px;max-width:92%;padding:10px 14px;border-radius:16px 16px 16px 4px;background:linear-gradient(135deg,#2f6bff,#7a6dff)}
+.c-lang{display:flex;flex-wrap:wrap;gap:6px;margin-top:14px}.c-lang em{font-style:normal;font-size:11.5px;padding:4px 10px;border-radius:999px;color:rgba(255,255,255,.75);border:1px solid rgba(255,255,255,.18)}
+.ai-cards{list-style:none;margin:0;padding:0;display:grid;grid-template-columns:1fr 1fr;gap:20px}
+.ai-cards li{display:flex;flex-direction:column;padding:28px;border-radius:24px;background:linear-gradient(180deg,rgba(255,255,255,.075),rgba(255,255,255,.025));border:1px solid rgba(255,255,255,.1);transition:opacity 1.1s cubic-bezier(.2,.7,.2,1),transform 1.1s cubic-bezier(.2,.7,.2,1),border-color .4s}
+.ai-cards li:hover{border-color:rgba(159,208,255,.4)}
+.ai-cards li:nth-child(2){transition-delay:.08s}.ai-cards li:nth-child(3){transition-delay:.16s}.ai-cards li:nth-child(4){transition-delay:.24s}
+.ai-cards h3{margin:26px 0 0;font:400 21px/1.25 "Sora",system-ui,sans-serif;letter-spacing:-.015em;color:#fff}
+.ai-cards p{margin:8px 0 0;font-size:15px;line-height:1.55;color:rgba(255,255,255,.66)}
 .apply-in{display:grid;grid-template-columns:.8fr 1.2fr;gap:56px;align-items:start}.apply-intro{position:sticky;top:110px}
 @media (max-width:980px){
- .hero-grid,.appx-in,.ai-in,.apply-in{grid-template-columns:1fr}.match{justify-self:start;margin-top:8px}
+ .hero-grid,.appx-in,.ai-head,.ai-body,.apply-in{grid-template-columns:1fr}.ai-head{gap:22px}.ai-vis{min-height:420px}.match{justify-self:start;margin-top:8px}
  .why{grid-template-columns:1fr;gap:28px}.steps{grid-template-columns:1fr 1fr;row-gap:36px}.steps::before{display:none}
  .apply-intro{position:static}.ph4{width:min(280px,72vw)}
 }
 @media (max-width:640px){
  .hero.ph{min-height:auto;align-items:stretch}.hero.ph .in{padding-top:118px;padding-bottom:48px}.h1{font-size:44px}.h2{font-size:36px}.lead{font-size:16.5px}
  .hero .acts .btn{flex:1 1 auto;justify-content:center}.match{width:100%}
+ .ai-cards{grid-template-columns:1fr;gap:14px}.ai-cards li{display:grid;grid-template-columns:50px 1fr;column-gap:16px;padding:20px}.ai-cards .ic{grid-row:1/3}.ai-cards h3{margin:2px 0 0;font-size:19px}.ai-cards p{margin-top:4px}.ai-vis{min-height:360px}.ai-chat{left:14px;right:14px;bottom:14px;padding:16px}.ai-acts .btn{width:100%;justify-content:center}
  .why h3{font-size:26px}.pl{height:52px;padding:0 22px;font-size:16px}
  .steps{grid-template-columns:1fr}.steps li{display:grid;grid-template-columns:60px 1fr;column-gap:18px;align-items:start}.steps li span{grid-row:1/3}.steps h3{margin:6px 0 0}
  .ff input,.ff select,.ff textarea{font-size:16px}  /* no iOS zoom on focus */
@@ -353,6 +386,13 @@
 """
 # ------------------------------------------------------------------ ABOUT
 L = M['logo']
+# Leadership tile: a photo when one exists (served from the app's committed public/main/images), else initials.
+LEAD_PHOTOS = {'Cheng Wai Kit': '/main/images/about/cheng-wai-kit.webp'}
+def lead_tile(i, n):
+    if n in LEAD_PHOTOS:
+        return f'<img src="{LEAD_PHOTOS[n]}" alt="{n}" width="64" height="64" loading="lazy" style="display:block;width:64px;height:64px;border-radius:20px;object-fit:cover;box-shadow:0 14px 28px -16px rgba(11,21,48,.55)">'
+    return f'<span style="display:grid;place-items:center;width:64px;height:64px;border-radius:20px;background:linear-gradient(135deg,#0b1530,#2f4a8f);color:#fff;font:500 20px Sora,system-ui,sans-serif">{i}</span>'
+
 about_body = f'''
 <section class="hero"><img class="bg" src="{M['img']['ab-hero']}" alt="Kuala Lumpur, Hong Kong and Dubai skylines connected by aurora light">
  <div class="in"><div class="eyebrow light">About PropertyLab</div><h1 class="h1">Smarter property decisions,<br><em style="background:linear-gradient(90deg,#9fd0ff,#c9bfff);-webkit-background-clip:text;background-clip:text;color:transparent">across borders.</em></h1>
@@ -411,7 +451,7 @@
 
 <section class="pad" style="background:var(--bg)"><div class="in">
  <div class="head rv"><div class="eyebrow">Leadership</div><h2 class="h2">The team behind<br><em>PropertyLab.</em></h2></div>
- <div class="grid4 mt">{''.join(f'<div class="card rv" style="text-align:left"><span style="display:grid;place-items:center;width:64px;height:64px;border-radius:20px;background:linear-gradient(135deg,#0b1530,#2f4a8f);color:#fff;font:500 20px Sora,system-ui,sans-serif">{i}</span><h3>{n}</h3><p>{r}</p></div>' for i,n,r in [('WK','Cheng Wai Kit','Founder &amp; Chief Executive Officer'),('LJ','Teh Lee Jie','Chief Technology Officer'),('DN','Dylan Ngan','Chief Revenue Officer'),('NT','Nicsman Tay','Chief Marketing Officer')])}</div>
+ <div class="grid4 mt">{''.join(f'<div class="card rv" style="text-align:left">{lead_tile(i, n)}<h3>{n}</h3><p>{r}</p></div>' for i,n,r in [('WK','Cheng Wai Kit','Founder &amp; Chief Executive Officer'),('LJ','Teh Lee Jie','Chief Technology Officer'),('DN','Dylan Ngan','Chief Revenue Officer'),('NT','Nicsman Tay','Chief Marketing Officer')])}</div>
 </div></section>
 
 <section class="pad"><div class="in">
