[object Object]

← back to Rentv 2026

Ship flagship homepage live — no tabs, bottom breaking bar, CRE data strip; robust loader fixes empty-data blanking

35e4b4427f9aacc09e83732796dfe663402549b5 · 2026-07-22 17:30:59 -0700 · Steve

Files touched

Diff

commit 35e4b4427f9aacc09e83732796dfe663402549b5
Author: Steve <steve@designerwallcoverings.com>
Date:   Wed Jul 22 17:30:59 2026 -0700

    Ship flagship homepage live — no tabs, bottom breaking bar, CRE data strip; robust loader fixes empty-data blanking
---
 public/index.html | 337 +++++++++++++++++++++++++-----------------------------
 1 file changed, 153 insertions(+), 184 deletions(-)

diff --git a/public/index.html b/public/index.html
index 225e35dd..f80efbd2 100644
--- a/public/index.html
+++ b/public/index.html
@@ -1,197 +1,166 @@
-<!doctype html>
-<html lang="en">
-<head>
+<!doctype html><html lang="en"><head>
 <meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
-<title>RENTV.com — Commercial Real Estate News, Deals &amp; Conferences</title>
-<meta name="description" content="Live commercial real estate news, deals, leases and financing across the Western U.S. — RENTV.com since 1998.">
+<title>RENTV.com — Commercial Real Estate News · Western U.S.</title>
+<meta name="description" content="RENTV.com — commercial real estate news, deals, financing, development and conferences across the Western United States since 1998.">
 <link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
-<link href="https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,700;1,400&family=Inter:wght@300;400;600;800&display=swap" rel="stylesheet">
+<link href="https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,700;0,800;1,600&family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
 <style>
-  :root{--red:#c8102e;--ink:#14171a;--sub:#5b636b;--line:#e4e7ea;--bg:#fff;--wash:#f5f6f8;--sans:'Inter',system-ui,sans-serif;--serif:'Playfair Display',Georgia,serif}
-  *{box-sizing:border-box;margin:0;padding:0}
-  body{font-family:var(--sans);color:var(--ink);background:var(--bg);line-height:1.45}
+  :root{--red:#c8102e;--ink:#14171a;--sub:#5b636b;--line:#e4e7ea;--wash:#f5f6f8;--up:#0f8a4d;--dn:#c8102e}
+  *{box-sizing:border-box;margin:0}
+  body{font-family:'Inter',system-ui,sans-serif;color:var(--ink);background:#fbfbfc;line-height:1.45}
   a{color:inherit;text-decoration:none}
-  .wrap{max-width:1200px;margin:0 auto;padding:0 20px}
-  .util{background:var(--ink);color:#cfd4d9;font-size:12px}
-  .util .wrap{display:flex;justify-content:space-between;align-items:center;height:34px}
-  .ticker{display:flex;gap:20px;overflow:hidden;white-space:nowrap}.ticker b{color:#fff}.up{color:#4ade80}.dn{color:#f87171}
-  .util .acts a{margin-left:14px;color:#cfd4d9}.util .acts a.sub{color:#fff;background:var(--red);padding:4px 12px;border-radius:3px;font-weight:700}
-  .mast{border-bottom:2px solid var(--ink);padding:18px 0 12px}
-  .mast{padding:20px 0 14px}
-  .mast .wrap{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;gap:3px}
-  .logo{font-family:var(--serif);font-weight:700;font-size:42px;letter-spacing:-1px}.logo span{color:var(--red)}
-  .logo small{display:block;font-size:11px;font-weight:600;letter-spacing:3px;color:var(--sub);text-transform:uppercase;margin-top:2px;font-family:var(--sans)}
-  .datebox{font-size:12px;color:var(--sub);text-align:center}
-  nav{border-bottom:1px solid var(--line);position:sticky;top:0;background:#fff;z-index:10}
-  nav .wrap{display:flex;gap:2px;align-items:center;height:46px}
-  .ham{display:none;background:none;border:0;font-size:24px;line-height:1;color:var(--ink);cursor:pointer;padding:8px 12px 8px 0;margin-right:4px}
-  .navlinks{display:flex;gap:2px;align-items:center;overflow-x:auto}
-  nav a{font-size:13px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;padding:13px 8px;border-bottom:3px solid transparent;white-space:nowrap;cursor:pointer}
-  nav a:hover,nav a.on{color:var(--red);border-color:var(--red)}
-  @media(max-width:860px){
-    .ham{display:block;margin-left:auto}
-    nav .wrap{height:52px}
-    .navlinks{display:none;position:absolute;top:52px;left:0;right:0;background:#fff;flex-direction:column;align-items:stretch;border-bottom:2px solid var(--ink);box-shadow:0 10px 24px rgba(0,0,0,.14);z-index:30;max-height:78vh;overflow-y:auto}
-    .navlinks.open{display:flex}
-    .navlinks a{padding:15px 20px;border-bottom:1px solid var(--line);border-left:4px solid transparent}
-    .navlinks a:hover,.navlinks a.on{color:var(--red);border-bottom:1px solid var(--line);border-left-color:var(--red)}
-  }
-  .breaking{background:var(--red);color:#fff;font-size:13px}
-  .breaking .wrap{display:flex;align-items:center;gap:14px;height:40px;overflow:hidden}
-  .breaking .tag{background:#fff;color:var(--red);font-weight:800;text-transform:uppercase;font-size:11px;letter-spacing:.08em;padding:3px 9px;border-radius:2px;flex:none}
-  .breaking .items{display:flex;gap:26px;white-space:nowrap;font-weight:600;animation:marq 40s linear infinite}
-  @keyframes marq{from{transform:translateX(0)}to{transform:translateX(-50%)}}
-  .grid{display:grid;grid-template-columns:1fr 320px;gap:34px;padding:28px 0}
-  .chip{display:inline-block;font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.06em;color:var(--red);margin-bottom:6px}
-  .lead{border-bottom:1px solid var(--line);padding-bottom:22px;margin-bottom:22px}
-  .lead .img{aspect-ratio:16/8;border-radius:6px;background:linear-gradient(135deg,#1f2937,#c8102e);position:relative;overflow:hidden}
-  .lead .img::after{content:'RENTV';position:absolute;right:12px;bottom:10px;color:rgba(255,255,255,.5);font-size:11px;letter-spacing:.2em}
-  .lead h1{font-family:var(--serif);font-size:36px;line-height:1.12;margin:14px 0 8px;letter-spacing:-.5px}
-  .lead .byl{font-size:12px;color:var(--sub);margin-top:8px}
-  .sechead{display:flex;align-items:center;gap:12px;border-top:3px solid var(--ink);padding-top:10px;margin:30px 0 16px}
-  .sechead h2{font-size:16px;text-transform:uppercase;letter-spacing:.06em}.sechead a{margin-left:auto;font-size:12px;color:var(--red);font-weight:700}
-  .cards{display:grid;grid-template-columns:1fr 1fr 1fr;gap:22px}
-  .card{display:block}
-  .card .img{aspect-ratio:16/10;border-radius:5px;background:linear-gradient(135deg,#475569,#94a3b8)}
-  .card:nth-child(3n+2) .img{background:linear-gradient(135deg,#7c2d12,#c8102e)}
-  .card:nth-child(3n) .img{background:linear-gradient(135deg,#0f766e,#14b8a6)}
-  .card h4{font-family:var(--serif);font-size:17px;line-height:1.22;margin:9px 0 4px}
-  .card .byl{font-size:12px;color:var(--sub);margin-top:6px}
-  .rail>*{margin-bottom:26px}.box{border:1px solid var(--line);border-radius:6px;padding:18px}
-  .ns{background:var(--ink);color:#fff;border:0}.ns h3{font-size:18px;margin-bottom:6px}.ns p{font-size:13px;color:#b9c0c7;margin-bottom:12px}
-  .ns input{width:100%;padding:11px;border:0;border-radius:4px;font-size:14px;margin-bottom:8px}
-  .ns button{width:100%;padding:11px;background:var(--red);color:#fff;border:0;border-radius:4px;font-weight:800;text-transform:uppercase;letter-spacing:.06em;font-size:12px;cursor:pointer}
-  .ns .ok{font-size:12px;color:#4ade80;margin-top:6px;display:none}
-  .mostread{counter-reset:mr;list-style:none}
-  .mostread li{counter-increment:mr;display:flex;gap:12px;padding:12px 0;border-bottom:1px solid var(--line)}
-  .mostread li::before{content:counter(mr);color:var(--red);font-family:var(--serif);font-size:26px;font-weight:700;line-height:1}
-  .mostread a{font-size:14px;font-weight:600;line-height:1.25}
-  .conf{background:linear-gradient(135deg,#111827,#c8102e);color:#fff;border:0;border-radius:6px;padding:22px}
-  .conf .k{font-size:11px;letter-spacing:.2em;text-transform:uppercase;opacity:.85}.conf h3{font-family:var(--serif);font-size:22px;margin:6px 0 8px}
-  .conf a{display:inline-block;background:#fff;color:var(--red);font-weight:800;font-size:12px;text-transform:uppercase;letter-spacing:.06em;padding:9px 16px;border-radius:4px}
-  .live{display:inline-flex;align-items:center;gap:6px;font-size:11px;color:var(--sub);letter-spacing:.06em;text-transform:uppercase}
-  .live .dot{width:7px;height:7px;border-radius:50%;background:#22c55e;box-shadow:0 0 0 0 rgba(34,197,94,.6);animation:pulse 2s infinite}
-  @keyframes pulse{0%{box-shadow:0 0 0 0 rgba(34,197,94,.6)}70%{box-shadow:0 0 0 7px rgba(34,197,94,0)}100%{box-shadow:0 0 0 0 rgba(34,197,94,0)}}
-  footer{background:var(--ink);color:#aeb6bd;margin-top:36px;padding:40px 0 30px;font-size:13px}
-  footer .cols{display:grid;grid-template-columns:2fr 1fr 1fr 1fr;gap:28px}
-  footer .logo{color:#fff;font-size:26px;margin-bottom:8px}footer h5{color:#fff;font-size:12px;text-transform:uppercase;letter-spacing:.08em;margin-bottom:10px}footer a{display:block;padding:4px 0;color:#aeb6bd}
-  footer .fine{border-top:1px solid #2a2f34;margin-top:26px;padding-top:16px;font-size:12px;color:#7c848b}
-  .skl{background:linear-gradient(90deg,#eee,#f6f6f6,#eee);background-size:200% 100%;animation:sh 1.2s infinite;border-radius:4px;color:transparent}
-  @keyframes sh{to{background-position:-200% 0}}
-  @media(max-width:860px){.grid{grid-template-columns:1fr}.cards{grid-template-columns:1fr 1fr}}
-</style>
-</head>
+  .top{position:sticky;top:0;z-index:900;display:flex;align-items:center;justify-content:space-between;height:54px;padding:0 16px;background:#fff;border-bottom:1px solid var(--line)}
+  .burger{display:inline-flex;align-items:center;gap:10px;border:0;background:none;cursor:pointer;font:inherit;color:inherit;padding:7px 9px;border-radius:8px}
+  .burger:hover{background:rgba(0,0,0,.06)}
+  .burger .lbl{font-size:12px;font-weight:800;letter-spacing:.14em;text-transform:uppercase;color:var(--sub)}
+  .brand{position:absolute;left:50%;transform:translateX(-50%);font-family:'Playfair Display',Georgia,serif;font-weight:800;font-size:25px;letter-spacing:.02em}.brand span{color:var(--red)}
+  .user{width:37px;height:37px;border-radius:50%;border:1.5px solid var(--line);background:#fff;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;color:var(--ink)}
+  .user:hover{border-color:var(--red);color:var(--red)}
+  .scrim{position:fixed;inset:0;background:rgba(6,9,12,.5);opacity:0;pointer-events:none;transition:opacity .22s;z-index:950}
+  .scrim.open{opacity:1;pointer-events:auto}
+  .drawer{position:fixed;top:0;left:0;height:100%;width:360px;max-width:88vw;background:#0b0e12;color:#e7ecf1;transform:translateX(-102%);transition:transform .26s cubic-bezier(.4,0,.2,1);z-index:951;display:flex;flex-direction:column;overflow-y:auto;box-shadow:2px 0 40px rgba(0,0,0,.4)}
+  .drawer.open{transform:none}
+  .drawer .dh{display:flex;align-items:center;justify-content:space-between;padding:16px 18px;border-bottom:1px solid #1c232b}
+  .drawer .dh .w{font-family:'Playfair Display',serif;font-size:23px;font-weight:800}.drawer .dh .w span{color:var(--red)}
+  .drawer .dh button{background:none;border:0;color:#8b949e;font-size:22px;cursor:pointer;line-height:1}
+  .snap{padding:12px 18px;border-bottom:1px solid #1c232b;display:grid;grid-template-columns:1fr 1fr;gap:10px}
+  .snap .m{background:#11161c;border:1px solid #1c232b;border-radius:8px;padding:8px 10px}
+  .snap .m .k{font-size:10px;letter-spacing:.06em;text-transform:uppercase;color:#7b848d}.snap .m .v{font-size:15px;font-weight:800;margin-top:2px}.snap .m .v.up{color:#37d67a}.snap .m .v.dn{color:#ff6b6b}
+  .grp{padding:14px 18px 4px}.grp .gt{font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:#6b747d;margin-bottom:6px}
+  .drawer nav a{display:block;padding:9px 18px;color:#dbe1e7;font-size:14.5px;border-left:3px solid transparent}
+  .drawer nav a:hover{background:#141a21;border-left-color:var(--red);color:#fff}
+  .drawer .df{margin-top:auto;padding:16px 18px;border-top:1px solid #1c232b;font-size:11px;color:#6b747d}
+  .datastrip{border-bottom:1px solid #e8e4e0;background:#f7f5f2}
+  .datastrip .in{max-width:1240px;margin:0 auto;display:flex;gap:34px;padding:9px 22px;font-size:11px;font-weight:500;letter-spacing:.06em;color:#4a4f55;overflow:hidden;white-space:nowrap}
+  .datastrip .m b{color:#14171a;font-weight:700;margin-left:6px}.datastrip .m b.dn{color:var(--red)}.datastrip .m b.up{color:var(--up)}
+  .fold{min-height:calc(100vh - 54px);display:flex;flex-direction:column}
+  .wrap{max-width:1240px;margin:0 auto;padding:0 22px;width:100%}
+  .hero{flex:1;display:grid;grid-template-columns:1.55fr 1fr;gap:34px;align-items:center;padding:28px 0}
+  .lead{padding-right:34px;border-right:1px solid #e2ded9}
+  .lead .im{display:block;height:380px;border-radius:6px;margin-bottom:16px;background:#12161a center/cover;box-shadow:inset 0 -90px 70px -50px rgba(0,0,0,.35)}
+  .lead .tag{color:var(--red);font-weight:800;font-size:12px;letter-spacing:.14em;text-transform:uppercase}
+  .lead h1{font-family:'Playfair Display',serif;font-size:clamp(44px,3.9vw,62px);line-height:1.08;margin:9px 0 12px;font-weight:700;letter-spacing:-.01em}
+  .lead .byl{color:#6b7178;font-size:13px}
+  .chipo{display:inline-block;background:var(--red);color:#fff;font-size:9px;font-weight:800;text-transform:uppercase;letter-spacing:.05em;padding:1px 6px;border-radius:8px;vertical-align:middle;margin-left:6px}
+  .aside{display:flex;flex-direction:column;gap:0}
+  .aside a{display:grid;grid-template-columns:80px 1fr;gap:13px;border-bottom:1px solid #e8e4e0;padding:13px 0}
+  .aside a:first-child{padding-top:0}
+  .aside .im{height:58px;border-radius:5px;background:#12161a center/cover;display:block}
+  .aside .tag{font-size:9px;font-weight:800;letter-spacing:.1em;text-transform:uppercase}.aside h4{font:600 14px/1.32 'Inter';margin-top:3px}
+  .breaking{background:#0b0e12;color:#fff;border-top:3px solid var(--red)}
+  .breaking .in{max-width:1240px;margin:0 auto;display:flex;align-items:stretch;height:52px}
+  .breaking .lbl{background:var(--red);display:flex;align-items:center;gap:9px;padding:0 20px;font-weight:800;font-size:12px;letter-spacing:.18em;text-transform:uppercase;white-space:nowrap;flex:none}
+  .breaking .lbl .dot{width:8px;height:8px;border-radius:50%;background:#fff;animation:bp 1.1s infinite}@keyframes bp{50%{opacity:.3;transform:scale(.8)}}
+  .ticker{position:relative;overflow:hidden;flex:1}
+  .ticker .track{display:flex;align-items:center;height:100%;white-space:nowrap;animation:bs 52s linear infinite;will-change:transform}
+  .ticker:hover .track{animation-play-state:paused}
+  @keyframes bs{from{transform:translateX(0)}to{transform:translateX(-50%)}}
+  .ticker .it{display:inline-flex;align-items:center;gap:11px;padding:0 24px;height:100%;color:#c3cbd3;font-size:14px;font-weight:600;cursor:pointer;border-right:1px solid #1a2129;transition:background .14s,color .14s}
+  .ticker .it .c{font-size:10px;font-weight:800;letter-spacing:.06em;text-transform:uppercase;padding:2px 8px;border-radius:20px;background:#161d25;color:#8b939b}
+  .ticker .it:hover{background:rgba(200,16,46,.16);color:#fff}.ticker .it:hover .c{background:var(--red);color:#fff}
+  .ticker .it.sel{background:var(--red);color:#fff}.ticker .it.sel .c{background:#fff;color:var(--red)}
+  .ticker .paused{position:absolute;right:16px;top:50%;transform:translateY(-50%);z-index:3;font-size:9px;font-weight:700;letter-spacing:.16em;color:rgba(255,255,255,.5);opacity:0;transition:opacity .3s;pointer-events:none}
+  .ticker:hover .paused{opacity:1}
+  .ticker .fade{position:absolute;top:0;bottom:0;width:64px;pointer-events:none;z-index:2}
+  .ticker .fade.l{left:0;background:linear-gradient(90deg,#0b0e12,transparent)}.ticker .fade.r{right:0;background:linear-gradient(270deg,#0b0e12,transparent)}
+  .selbar{max-width:1240px;margin:0 auto;display:none;padding:12px 22px;background:#11161c;color:#e7ecf1;border-top:1px solid #1c232b;align-items:center;gap:14px}
+  .selbar.on{display:flex}.selbar .c{font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.05em;background:var(--red);padding:3px 9px;border-radius:20px}
+  .selbar a{color:#fff;font-weight:700}.selbar a:hover{text-decoration:underline}.selbar .x{margin-left:auto;background:none;border:0;color:#8b939b;cursor:pointer;font-size:18px}
+  .sec{padding:34px 0}
+  h2.rule{font-size:13px;text-transform:uppercase;letter-spacing:.09em;border-top:2px solid var(--ink);padding-top:10px;margin-bottom:16px;font-weight:800}
+  .river{display:grid;grid-template-columns:repeat(4,1fr);gap:18px}
+  .river .im{height:130px;border-radius:5px;background:#12161a center/cover;display:block;margin-bottom:8px}
+  .river .tag{font-size:10px;font-weight:800;text-transform:uppercase}.river h4{font:600 15px/1.25 'Inter';margin-top:3px}
+  .cta{background:var(--red);color:#fff;border-radius:10px;padding:26px;display:flex;gap:16px;align-items:center;flex-wrap:wrap;justify-content:center;margin:26px 0 40px}
+  .cta h3{font-family:'Playfair Display',serif;font-size:23px}
+  .cta input{flex:1;min-width:240px;max-width:340px;border:0;border-radius:6px;padding:12px 14px;font:inherit}
+  .cta button{background:#0b0e12;color:#fff;border:0;border-radius:6px;padding:12px 22px;font-weight:800;cursor:pointer}
+  .cta .ok{display:none;font-weight:700}
+  footer{background:#0b0e12;color:#8b939b;padding:30px 0;font-size:12px}
+  footer .cols{max-width:1240px;margin:0 auto;padding:0 22px;display:grid;grid-template-columns:2fr 1fr 1fr 1fr;gap:20px}
+  footer h5{color:#e7ecf1;font-size:12px;text-transform:uppercase;letter-spacing:.06em;margin-bottom:8px}
+  footer a{display:block;color:#9aa4ad;padding:3px 0}footer .logo{font-family:'Playfair Display',serif;font-size:22px;font-weight:800;color:#fff}footer .logo span{color:var(--red)}
+  .fine{max-width:1240px;margin:18px auto 0;padding:14px 22px 0;border-top:1px solid #1c232b;color:#6b747d}
+  @media(max-width:900px){.hero,.river,footer .cols{grid-template-columns:1fr}.lead{padding-right:0;border-right:0}.river{grid-template-columns:1fr 1fr}}
+</style></head>
 <body>
-  <div class="util"><div class="wrap">
-    <div class="ticker" id="ticker"><span><b>CRE INDEX</b> …</span><span><b>10-YR</b> …</span><span><b>LA OFFICE VAC</b> …</span><span><b>IE INDUSTRIAL CAP</b> …</span></div>
-    <div class="acts"><a href="/subscribe">Newsletters</a><a href="/advertise">Advertise</a><a class="sub" href="/subscribe">Subscribe</a></div>
-  </div></div>
+<header class="top">
+  <button class="burger" id="burger" aria-label="Menu"><svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round"><path d="M3 6h18M3 12h18M3 18h18"/></svg><span class="lbl">Menu</span></button>
+  <a class="brand" href="/">REN<span>TV</span></a>
+  <button class="user" id="user" title="Sign in" aria-label="Sign in"><svg width="19" height="19" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="8" r="3.5"/><path d="M4.5 20a7.5 7.5 0 0 1 15 0" stroke-linecap="round"/></svg></button>
+</header>
+<div class="scrim" id="scrim"></div>
+<aside class="drawer" id="drawer">
+  <div class="dh"><span class="w">REN<span>TV</span></span><button id="dclose" aria-label="Close">✕</button></div>
+  <div class="snap" id="snap"></div>
+  <div class="grp"><div class="gt">Sections</div></div>
+  <nav><a href="/sales">Sales</a><a href="/leases">Leases</a><a href="/financing">Financing</a><a href="/development">Development</a><a href="/multifamily">Multifamily</a><a href="/industrial">Industrial</a><a href="/retail">Retail</a></nav>
+  <div class="grp"><div class="gt">Intelligence</div></div>
+  <nav><a href="/markets">Markets</a><a href="/la-commercial">LA Commercial</a><a href="/review">The REview</a><a href="/cre-talk">CRE Talk</a><a href="/conferences">Conferences</a><a href="/blog">Blog</a></nav>
+  <div class="grp"><div class="gt">Company</div></div>
+  <nav><a href="/about">About</a><a href="/advertise">Advertise</a><a href="/subscribe">Subscribe / Newsletters</a></nav>
+  <div class="df">RENTV.com — Commercial Real Estate News across the Western U.S. since 1998.</div>
+</aside>
 
-  <header class="mast"><div class="wrap">
-    <div class="logo">REN<span>TV</span>.com<small>Commercial Real Estate News</small></div>
-    <div class="datebox"><span id="edition">Western U.S. Edition</span><br><span id="today"></span></div>
-  </div></header>
-
-  <nav><div class="wrap">
-    <button class="ham" id="hamBtn" aria-label="Menu" aria-expanded="false">☰</button>
-    <div class="navlinks" id="nav">
-      <a data-cat="all" class="on">Home</a><a data-cat="Sales">Sales</a><a data-cat="Leases">Leases</a><a data-cat="Financing">Financing</a><a data-cat="Development">Development</a><a data-cat="Multifamily">Multifamily</a><a data-cat="Industrial">Industrial</a><a data-cat="Retail">Retail</a><a href="/markets">Markets</a><a href="/la-commercial">LA Commercial</a><a href="/review">The REview</a><a href="/cre-talk">CRE Talk</a><a href="/conferences">Conferences</a><a href="/versions">Versions</a><a href="/blog">Blog</a>
-    </div>
-  </div></nav>
-
-  <div class="breaking"><div class="wrap">
-    <span class="tag">Breaking</span><div class="items" id="breaking"><span>Loading live deals…</span></div>
-  </div></div>
-
-  <div class="wrap"><div class="grid">
-    <main>
-      <article class="lead" id="lead"><div class="img"></div><span class="chip">&nbsp;</span><h1 class="skl">&nbsp;<br>&nbsp;</h1><div class="byl">Loading the latest from RENTV…</div></article>
-      <div class="sechead"><h2>Latest CRE News</h2><span class="live"><span class="dot"></span><span id="freshness">live</span></span></div>
-      <div class="cards" id="cards"></div>
-    </main>
-    <aside class="rail">
-      <div class="ns box"><h3>The RENTV Daily</h3><p>Western-U.S. commercial real estate deals in your inbox every morning — free.</p><input id="email" placeholder="you@company.com"><button id="subbtn">Subscribe free</button><div class="ok" id="subok">✓ You're on the list.</div></div>
-      <div><div class="sechead" style="margin-top:0"><h2>Most Read</h2></div><ol class="mostread" id="mostread"></ol></div>
-      <div class="conf" id="conf"><div class="k">RENTV Conferences</div><h3>State of the Market Summit</h3><p style="font-size:13px;opacity:.9">600+ brokers, investors &amp; developers · Los Angeles.</p><a href="/conferences">Register →</a></div>
-      <div class="box"><div class="sechead" style="margin-top:0"><h2>Market Snapshot</h2></div>
-        <div style="display:flex;justify-content:space-between;padding:7px 0;border-bottom:1px solid var(--line);font-size:13px"><span>LA Office Vacancy</span><b>23.1%</b></div>
-        <div style="display:flex;justify-content:space-between;padding:7px 0;border-bottom:1px solid var(--line);font-size:13px"><span>IE Industrial Cap</span><b>5.2%</b></div>
-        <div style="display:flex;justify-content:space-between;padding:7px 0;font-size:13px"><span>SF Multifamily Rent YoY</span><b class="up">+3.4%</b></div>
-      </div>
-    </aside>
-  </div></div>
-
-  <footer><div class="wrap"><div class="cols">
-    <div><div class="logo">REN<span style="color:var(--red)">TV</span>.com</div><p style="max-width:34ch">Commercial real estate news, deals &amp; conferences across the Western United States since 1998.</p></div>
-    <div><h5>Sections</h5><a href="/sales">Sales</a><a href="/leases">Leases</a><a href="/financing">Financing</a><a href="/development">Development</a><a href="/multifamily">Multifamily</a><a href="/industrial">Industrial</a><a href="/retail">Retail</a><a href="/markets">Markets</a><a href="/la-commercial">LA Commercial</a></div>
-    <div><h5>Company</h5><a href="/about">About</a><a href="/advertise">Advertise</a><a href="/conferences">Conferences</a><a href="/subscribe">Subscribe</a></div>
-    <div><h5>Follow</h5><a href="https://www.linkedin.com/company/rentv.com-inc" target="_blank" rel="noopener">LinkedIn</a><a href="/review">The REview</a><a href="/subscribe">Newsletters</a></div>
-  </div><div class="fine">© 2026 RENTV.com · Headlines refreshed live from rentv.com · <span id="src"></span></div></div></footer>
+<div class="fold">
+  <div class="datastrip"><div class="in" id="datastrip"></div></div>
+  <main class="wrap"><section class="hero"><div class="lead" id="lead"></div><div class="aside" id="aside"></div></section></main>
+  <div class="selbar" id="selbar"></div>
+  <div class="breaking"><div class="in"><div class="lbl"><span class="dot"></span> Breaking</div>
+    <div class="ticker" id="ticker"><div class="fade l"></div><div class="fade r"></div><span class="paused">Paused · hover to browse</span><div class="track" id="track"></div></div></div></div>
+</div>
 
+<main class="wrap">
+  <section class="sec"><h2 class="rule">Across the market</h2><div class="river" id="river"></div></section>
+  <div class="cta"><h3>The morning CRE briefing, in your inbox.</h3><input id="email" type="email" placeholder="you@company.com"><button id="subbtn">Subscribe</button><span class="ok" id="subok">✓ You're in.</span></div>
+</main>
+<footer><div class="cols">
+  <div><div class="logo">REN<span>TV</span>.com</div><p style="max-width:34ch;margin-top:8px">Commercial real estate news, deals &amp; conferences across the Western United States since 1998.</p></div>
+  <div><h5>Sections</h5><a href="/sales">Sales</a><a href="/leases">Leases</a><a href="/financing">Financing</a><a href="/development">Development</a><a href="/la-commercial">LA Commercial</a></div>
+  <div><h5>Intelligence</h5><a href="/markets">Markets</a><a href="/review">The REview</a><a href="/cre-talk">CRE Talk</a><a href="/conferences">Conferences</a><a href="/blog">Blog</a></div>
+  <div><h5>Company</h5><a href="/about">About</a><a href="/advertise">Advertise</a><a href="/subscribe">Subscribe</a></div>
+</div><div class="fine">© 2026 RENTV.com · Headlines refreshed live from rentv.com · <span id="src"></span></div></footer>
 <script>
-document.getElementById('today').textContent = new Date().toLocaleDateString(undefined,{weekday:'long',year:'numeric',month:'long',day:'numeric'});
-// DTD-C: a "section" is the home feed filtered by ?cat= (section routes 301 here).
-var _CATS=['Sales','Leases','Financing','Development','Multifamily','Industrial','Retail'];
-var _q=(new URLSearchParams(location.search).get('cat')||'').toLowerCase();
-var _match=_CATS.filter(function(c){return c.toLowerCase()===_q;})[0];
-let ALL=[], cat=_match||'all';
-const esc=s=>(s||'').replace(/[&<>"]/g,c=>({'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;'}[c]));
-const bgimg=o=>(o&&o.image)?(' style="background:#12161a url(\''+esc(o.image)+'\') center/cover"'):'';
-var LK=x=>(x.orig?'/post/':'/news/')+encodeURIComponent(x.id); // originals → the blog reader
-var OB=x=>x.orig?' <span style="background:var(--red);color:#fff;font-size:9px;font-weight:800;text-transform:uppercase;letter-spacing:.05em;padding:1px 6px;border-radius:8px;vertical-align:middle">Original</span>':'';
-function render(){
-  const items = cat==='all'?ALL:ALL.filter(x=>x.cat===cat);
-  const lead=items[0];
-  if(lead){document.getElementById('lead').innerHTML='<a href="'+LK(lead)+'"><div class="img"'+bgimg(lead)+'></div><span class="chip">'+esc(lead.cat)+' · Western U.S.'+OB(lead)+'</span><h1>'+esc(lead.title)+'</h1><div class="byl">'+(lead.orig?'By '+esc(lead.author||'RENTV Staff')+' · RENTV Original':'By RENTV Staff · live from rentv.com')+'</div></a>';}
-  const cards=items.slice(1,13).map(x=>'<a class="card" href="'+LK(x)+'"><div class="img"'+bgimg(x)+'></div><span class="chip">'+esc(x.cat)+OB(x)+'</span><h4>'+esc(x.title)+'</h4><div class="byl">'+(x.orig?esc(x.author||'RENTV Staff'):'RENTV Staff')+'</div></a>').join('');
-  document.getElementById('cards').innerHTML=cards||'<p style="color:var(--sub)">No items in this section right now.</p>';
-  document.getElementById('breaking').innerHTML=ALL.slice(0,6).map(x=>'<span>'+esc(x.title)+'</span>').join(' · ').repeat(2);
-  document.getElementById('mostread').innerHTML=ALL.slice(0,5).map(x=>'<li><a href="'+LK(x)+'">'+esc(x.title)+'</a></li>').join('');
-}
+const $=s=>document.getElementById(s), esc=s=>(s||'').replace(/[&<>"]/g,c=>({'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;'}[c]));
+const bg=o=>(o&&o.image)?(' style="background-image:url(\''+esc(o.image)+'\')"'):'';
+const LK=x=>(x.orig?'/post/':'/news/')+encodeURIComponent(x.id);
+$('burger').onclick=()=>{$('scrim').classList.add('open');$('drawer').classList.add('open');};
+const closeDrawer=()=>{$('scrim').classList.remove('open');$('drawer').classList.remove('open');};
+$('dclose').onclick=closeDrawer;$('scrim').onclick=closeDrawer;
+$('user').onclick=()=>location.href='/subscribe';
+async function jget(url){try{const r=await fetch(url,{credentials:'same-origin'});if(!r.ok)return null;return await r.json();}catch(e){return null;}}
+let ALL=[];
 async function load(){
-  try{
-    const [d,pd]=await Promise.all([
-      (await fetch('/api/news')).json(),
-      fetch('/api/posts?status=published').then(r=>r.json()).catch(()=>({items:[]}))
-    ]);
-    const orig=(pd.items||[]).map(p=>({id:p.id,title:p.title,cat:p.cat,image:p.image,author:p.author,orig:true}));
-    ALL=orig.concat((d.items||[]).map(x=>({...x,title:x.title}))); // RENTV Originals lead the feed
-    if(ALL.length){render();
-      const mins=Math.max(0,Math.round((Date.now()-new Date(d.fetched_at))/60000));
-      document.getElementById('freshness').textContent=mins<2?'updated just now':('updated '+mins+' min ago');
-      document.getElementById('src').textContent='last pull '+new Date(d.fetched_at).toLocaleTimeString();
-    }
-  }catch(e){document.getElementById('lead').querySelector('.byl').textContent='Live feed temporarily unavailable — retrying…';}
+  const [d,pd]=await Promise.all([jget('/api/news'),jget('/api/posts?status=published')]);
+  const news=(d&&d.items)||[], orig=((pd&&pd.items)||[]).map(p=>({id:p.id,title:p.title,cat:p.cat,image:p.image,author:p.author,orig:true}));
+  ALL=orig.concat(news);
+  if(!ALL.length){$('lead').innerHTML='<div class="tag">RENTV.com</div><h1>Live commercial real estate news, refreshing…</h1><div class="byl">If this persists, the wire is briefly unavailable — please reload.</div>';return;}
+  // lead with the top story that HAS an image (never a blank-image placeholder); keep the rest in order
+  const li=ALL.findIndex(x=>x&&x.image); const lead=li>=0?ALL[li]:ALL[0];
+  const rest=ALL.filter((_,i)=>i!==(li>=0?li:0));
+  const l=lead;
+  $('lead').innerHTML=`<div class="im"${bg(l)}></div><span class="tag">${esc(l.cat||'RENTV')}${l.orig?'<span class="chipo">Original</span>':''}</span><h1>${esc(l.title)}</h1><div class="byl">${l.orig?'By '+esc(l.author||'RENTV Staff')+' · RENTV Original':'By RENTV Staff · live from rentv.com'}</div>`;
+  $('lead').style.cursor='pointer';$('lead').onclick=()=>location.href=LK(l);
+  $('aside').innerHTML=rest.slice(0,4).map(n=>`<a href="${LK(n)}"><div class="im"${bg(n)}></div><div><span class="tag" style="color:var(--red)">${esc(n.cat||'')}</span><h4>${esc(n.title)}</h4></div></a>`).join('');
+  const items=ALL.slice(0,16), mk=n=>`<a class="it" data-id="${esc(n.id)}" data-cat="${esc(n.cat||'')}" data-title="${esc(n.title)}" data-href="${LK(n)}"><span class="c">${esc(n.cat||'')}</span>${esc(n.title)}</a>`;
+  $('track').innerHTML=items.map(mk).join('')+items.map(mk).join('');
+  const selbar=$('selbar');
+  $('track').querySelectorAll('.it').forEach(a=>a.addEventListener('click',e=>{e.preventDefault();
+    $('track').querySelectorAll('.it').forEach(x=>x.classList.remove('sel'));$('track').querySelectorAll('.it[data-id="'+a.dataset.id+'"]').forEach(x=>x.classList.add('sel'));
+    selbar.innerHTML=`<span class="c">${esc(a.dataset.cat)}</span><a href="${a.dataset.href}">${esc(a.dataset.title)}</a><button class="x" aria-label="close">✕</button>`;selbar.classList.add('on');
+    selbar.querySelector('.x').onclick=ev=>{ev.stopPropagation();selbar.classList.remove('on');$('track').querySelectorAll('.it').forEach(x=>x.classList.remove('sel'));};}));
+  $('river').innerHTML=rest.slice(4,12).map(n=>`<a href="${LK(n)}"><div class="im"${bg(n)}></div><span class="tag" style="color:var(--red)">${esc(n.cat||'')}</span><h4>${esc(n.title)}</h4></a>`).join('');
+  if(d&&d.fetched_at){$('src').textContent='last pull '+new Date(d.fetched_at).toLocaleTimeString();}
 }
-const hamBtn=document.getElementById('hamBtn');
-hamBtn.addEventListener('click',()=>{const open=document.getElementById('nav').classList.toggle('open');hamBtn.setAttribute('aria-expanded',open);});
-document.getElementById('nav').addEventListener('click',e=>{const a=e.target.closest('a');if(!a)return;document.getElementById('nav').classList.remove('open');hamBtn.setAttribute('aria-expanded','false');if(!a.dataset.cat)return;e.preventDefault();document.querySelectorAll('#nav a').forEach(x=>x.classList.remove('on'));a.classList.add('on');cat=a.dataset.cat;render();window.scrollTo({top:0,behavior:'smooth'});});
-document.getElementById('subbtn').onclick=function(){
-  var em=(document.getElementById('email').value||'').trim();
-  if(!/^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(em)){document.getElementById('email').focus();return;}
-  var btn=document.getElementById('subbtn');btn.setAttribute('disabled','');
-  fetch('/api/subscribe',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({email:em,source:'homepage-rail'})})
-    .then(function(r){return r.json();}).then(function(j){
-      if(j&&j.ok){document.getElementById('subok').style.display='block';document.getElementById('email').setAttribute('disabled','');}
-      else{btn.removeAttribute('disabled');}
-    }).catch(function(){btn.removeAttribute('disabled');});
-};
 async function loadTicker(){
-  try{
-    const t=await (await fetch('/api/ticker')).json();
-    const cell=m=>{ if(!m||!m.value) return '';
-      const amt=m.change_pct!=null?Math.abs(m.change_pct)+'%':(m.change_bps!=null?Math.abs(m.change_bps)+'bps':'');
-      let arr=''; if(m.dir==='up')arr=' <span class="up">▲'+amt+'</span>'; else if(m.dir==='down')arr=' <span class="dn">▼'+amt+'</span>';
-      return '<span><b>'+esc(m.label)+'</b> '+esc(m.value)+arr+'</span>'; };
-    const html=[t.cre_index,t.ten_yr,t.la_office_vac,t.ie_industrial_cap].map(cell).filter(Boolean).join('');
-    if(html) document.getElementById('ticker').innerHTML=html;
-  }catch(e){/* keep prior ticker on failure */}
+  const t=await jget('/api/ticker'); if(!t)return;
+  const metrics=Object.values(t).filter(m=>m&&m.label&&m.value!=null);
+  const cell=m=>{const cls=m.dir==='up'?'up':m.dir==='down'?'dn':'';const chg=m.change_pct!=null?` ${m.change_pct>0?'+':''}${m.change_pct}%`:'';return `<span class="m">${esc(m.label)}<b class="${cls}">${esc(m.value)}${chg}</b></span>`;};
+  $('datastrip').innerHTML=metrics.map(cell).join('');
+  $('snap').innerHTML=metrics.map(m=>`<div class="m"><div class="k">${esc(m.label)}</div><div class="v ${m.dir==='up'?'up':m.dir==='down'?'dn':''}">${esc(m.value)}</div></div>`).join('');
 }
-// if we arrived via /?cat=Leases, highlight that section in the nav
-if(cat!=='all'){document.querySelectorAll('#nav a').forEach(function(a){a.classList.toggle('on',a.dataset.cat===cat);});}
-load(); setInterval(load, 120000); // refresh the live feed every 2 minutes
-loadTicker(); setInterval(loadTicker, 120000); // live market ticker
+$('subbtn').onclick=function(){var em=($('email').value||'').trim();if(!/^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(em)){$('email').focus();return;}
+  this.setAttribute('disabled','');fetch('/api/subscribe',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({email:em,source:'homepage'})}).then(r=>r.json()).then(j=>{if(j&&j.ok){$('subok').style.display='inline';$('email').setAttribute('disabled','');}else this.removeAttribute('disabled');}).catch(()=>this.removeAttribute('disabled'));};
+load(); setInterval(load,120000); loadTicker(); setInterval(loadTicker,120000);
 </script>
-<script src="/theme.js"></script>
-</body>
-</html>
+</body></html>

← 365ef78b auto-save: 2026-07-22T17:15:39 (3 files) — data/markets.json  ·  back to Rentv 2026  ·  Ship RENTV Intelligence Desk live at /desk — left-rail switc 4645759d →