← back to Rentv 2026
market-pulse: pin full site nav into the persistent left rail (always shown) above the collapsed data categories
83c2c24c9817045b052670f57284cddf8e8c1e8c · 2026-07-25 00:07:12 -0700 · Steve
Files touched
M data/markets.jsonM data/news.jsonM data/ticker.jsonM public/market-pulse.html
Diff
commit 83c2c24c9817045b052670f57284cddf8e8c1e8c
Author: Steve <steve@designerwallcoverings.com>
Date: Sat Jul 25 00:07:12 2026 -0700
market-pulse: pin full site nav into the persistent left rail (always shown) above the collapsed data categories
---
data/markets.json | 2 +-
data/news.json | 2 +-
data/ticker.json | 2 +-
public/market-pulse.html | 40 ++++++++++++++++++++++++++++++++++------
4 files changed, 37 insertions(+), 9 deletions(-)
diff --git a/data/markets.json b/data/markets.json
index 27426343..2ded2388 100644
--- a/data/markets.json
+++ b/data/markets.json
@@ -1,5 +1,5 @@
{
- "fetched_at": "2026-07-25T06:47:02.458Z",
+ "fetched_at": "2026-07-25T07:07:05.242Z",
"source": "Yahoo Finance — live (CBOE Treasury yields, Dow Jones/MSCI REIT indices)",
"curve": [
{
diff --git a/data/news.json b/data/news.json
index ed8f8be5..109c1c9d 100644
--- a/data/news.json
+++ b/data/news.json
@@ -1,6 +1,6 @@
{
"source": "rentv.com — live",
- "fetched_at": "2026-07-25T06:47:02.252Z",
+ "fetched_at": "2026-07-25T07:07:04.995Z",
"count": 23,
"items": [
{
diff --git a/data/ticker.json b/data/ticker.json
index 2dc6a8fd..9634d215 100644
--- a/data/ticker.json
+++ b/data/ticker.json
@@ -1,5 +1,5 @@
{
- "fetched_at": "2026-07-25T06:47:02.424Z",
+ "fetched_at": "2026-07-25T07:07:05.213Z",
"la_office_vac": {
"label": "LA OFFICE VAC",
"value": "23.1%",
diff --git a/public/market-pulse.html b/public/market-pulse.html
index 380c31c1..6b6e3f5b 100644
--- a/public/market-pulse.html
+++ b/public/market-pulse.html
@@ -227,6 +227,12 @@
.mp-row .rv{font-family:var(--mono);font-weight:600;font-variant-numeric:tabular-nums}
.mp-row .rv.up{color:var(--up)}.mp-row .rv.down{color:var(--down)}.mp-row .rv.flat{color:var(--ink)}
.mp-rail .rail-foot{padding:12px 8px 0;font-size:10px;letter-spacing:.3px;color:var(--ink-faint)}
+ .rail-nav{margin-bottom:10px}
+ .rail-nav .rn-grp{padding:6px 0 4px}
+ .rail-nav .rn-gt{font-size:9.5px;letter-spacing:.16em;text-transform:uppercase;color:#6b747d;padding:0 10px 5px}
+ .rail-nav a{display:block;padding:6px 10px;border-radius:7px;color:var(--ink-dim);font-size:12.5px;border-left:2px solid transparent}
+ .rail-nav a:hover{background:var(--panel-2);color:var(--ink);border-left-color:#c8102e}
+ .rail-nav a.active{background:var(--panel-2);color:var(--ink);border-left-color:var(--accent);font-weight:700}
@media (max-width:900px){
.mp-layout{flex-direction:column}
.mp-rail{position:static;width:auto;height:auto;border-right:0;border-bottom:1px solid var(--line)}
@@ -263,7 +269,29 @@
</aside>
<div class="mp-layout">
-<aside class="mp-rail" id="mpRail"></aside>
+<aside class="mp-rail" id="mpRail">
+ <div class="rail-h">Navigate</div>
+ <div class="rail-nav">
+ <div class="rn-grp"><div class="rn-gt">Discover</div>
+ <a href="/search">🔎 Search</a>
+ <a href="/market-pulse" class="active">📈 Rates & Capital Markets</a>
+ <a href="/pulse">📊 Market Pulse (Deal Flow)</a>
+ <a href="/markets">🏙️ Markets</a>
+ </div>
+ <div class="rn-grp"><div class="rn-gt">Sections</div>
+ <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>
+ </div>
+ <div class="rn-grp"><div class="rn-gt">Intelligence</div>
+ <a href="/deals">Deals</a><a href="/la-commercial">LA Commercial</a><a href="/desk">Broker & Owner Desk</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 class="rn-grp"><div class="rn-gt">Company</div>
+ <a href="/about">About</a><a href="/advertise">Advertise</a><a href="/subscribe">Subscribe / Newsletters</a>
+ </div>
+ </div>
+ <div class="rail-h">Market Data</div>
+ <div id="mpRailData"></div>
+ <div class="rail-foot">All items shown · click a category to expand</div>
+</aside>
<div class="wrap">
<div class="pulse-band">
@@ -554,22 +582,22 @@ function tick(){
so a live update never blanks the panel or re-collapses what you opened. ---------- */
const esc = s => String(s == null ? '' : s).replace(/[&<>"]/g, c => ({'&':'&','<':'<','>':'>','"':'"'}[c]));
function renderRail(){
- const rail = $('#mpRail');
- if(!rail) return;
- const openSet = new Set([...rail.querySelectorAll('.mp-cat[open]')].map(d => d.dataset.cat));
+ const host = $('#mpRailData');
+ if(!host) return;
+ const openSet = new Set([...host.querySelectorAll('.mp-cat[open]')].map(d => d.dataset.cat));
const cats = [
{key:'curve', name:'Yield Curve', rows: marketData.curve.map(c => ({l:c.label + ' UST', v:c.value, d:c.dir}))},
{key:'spreads', name:'Curve Spreads', rows: marketData.spreads.map(s => ({l:s.label, v:s.value, d:s.dir}))},
{key:'reits', name:'REIT Performance', rows: marketData.reits.map(r => ({l:r.label, v:r.value, d:r.dir}))},
{key:'funds', name:'Market Fundamentals', rows: marketData.fundamentals.map(f => ({l:f.label, v:f.value, d:'flat'}))}
];
- rail.innerHTML = '<div class="rail-h">Market Data</div>' + cats.map(c => `
+ host.innerHTML = cats.map(c => `
<details class="mp-cat" data-cat="${c.key}"${openSet.has(c.key) ? ' open' : ''}>
<summary>${esc(c.name)}<span class="badge">${c.rows.length}</span><span class="chev">▶</span></summary>
<div class="mp-rows">${c.rows.map(r =>
`<div class="mp-row"><span class="rl">${esc(r.l)}</span><span class="rv ${r.d}">${esc(r.v)}</span></div>`
).join('')}</div>
- </details>`).join('') + '<div class="rail-foot">All fields shown · click a category to expand</div>';
+ </details>`).join('');
}
/* ---------- render everything from the current marketData ---------- */
← ce438f64 auto-save: 2026-07-25T00:01:48 (4 files) — data/markets.json
·
back to Rentv 2026
·
market-pulse: consolidate all nav into the single hamburger; 2a251feb →