[object Object]

← back to Commercialrealestate

CRCP fleet: add canonical day/night theme (crcp-theme.css/js + head boot) to 24 theme-less pages; corner-nav on property.html; fix crcp.html crcp-theme2->crcp-theme key

dbe3051d09e47ff32fcbcf9745d2fc3d1e924be7 · 2026-08-18 17:57:28 -0700 · Steve Abrams

Files touched

Diff

commit dbe3051d09e47ff32fcbcf9745d2fc3d1e924be7
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Tue Aug 18 17:57:28 2026 -0700

    CRCP fleet: add canonical day/night theme (crcp-theme.css/js + head boot) to 24 theme-less pages; corner-nav on property.html; fix crcp.html crcp-theme2->crcp-theme key
---
 public/admin.html               |  3 +++
 public/broker-grid.html         |  3 +++
 public/brokers.html             |  3 +++
 public/condos.html              |  3 +++
 public/contractors.html         |  3 +++
 public/crcp.html                |  8 ++++----
 public/credit-unions.html       |  3 +++
 public/deals-flow.html          |  3 +++
 public/deals.html               |  3 +++
 public/fha-leads.html           |  3 +++
 public/gov-agents.html          |  3 +++
 public/lenders.html             |  3 +++
 public/lending.html             |  3 +++
 public/licensed-agents.html     |  3 +++
 public/licensed.html            |  3 +++
 public/linkedin.html            |  3 +++
 public/loan-officers.html       |  3 +++
 public/map.html                 |  3 +++
 public/mortgage-market.html     |  3 +++
 public/parcel.html              |  3 +++
 public/property.html            |  4 ++++
 public/rent-rolls.html          |  3 +++
 public/residential-brokers.html |  3 +++
 public/sales.html               |  3 +++
 public/sba-lenders.html         |  3 +++
 scripts/apply-crcp-theme.js     | 29 +++++++++++++++++++++++++++++
 26 files changed, 106 insertions(+), 4 deletions(-)

diff --git a/public/admin.html b/public/admin.html
index 70203bc..3729d38 100644
--- a/public/admin.html
+++ b/public/admin.html
@@ -1,6 +1,7 @@
 <!doctype html>
 <html lang="en">
 <head>
+<script>(function(){try{var t=localStorage.getItem('crcp-theme');document.documentElement.setAttribute('data-theme',t==='light'?'light':'dark');}catch(e){document.documentElement.setAttribute('data-theme','dark');}})();</script>
 <!-- Self-heal: nav-agent grid controls can persist a "removed"/"collapsed" state that hides the
      whole grid with no obvious way back. Clear it before nav-agent runs so a grid can never stay hidden. -->
 <script>(function(){try{for(var i=localStorage.length-1;i>=0;i--){var k=localStorage.key(i);if(k&&k.indexOf('navagent:')===0){var v=localStorage.getItem(k);if(v&&v.indexOf('"removed":true')>=0){localStorage.removeItem(k);}}}}catch(e){}})();</script>
@@ -53,6 +54,7 @@ tr:hover td{background:#12171f}
 .nlist .n .tx{white-space:pre-wrap;margin-top:4px;font-size:12px}
 </style>
   <link rel="stylesheet" href="/nav-agent/nav-agent.css"><!-- nav-agent -->
+  <link rel="stylesheet" href="/crcp-theme.css"><!-- CRCP day/night tokens: load LAST so html[data-theme] wins -->
 </head>
 <body>
 <header>
@@ -225,5 +227,6 @@ boot();
 </script>
 <script src="/corner-nav.js" defer></script>
   <script src="/nav-agent/nav-agent.js" defer></script><!-- nav-agent -->
+  <script src="/crcp-theme.js" defer></script><!-- CRCP day/night toggle (auto-injects into header) -->
 </body>
 </html>
diff --git a/public/broker-grid.html b/public/broker-grid.html
index 46b2fa2..da811af 100644
--- a/public/broker-grid.html
+++ b/public/broker-grid.html
@@ -1,6 +1,7 @@
 <!doctype html>
 <html lang="en">
 <head>
+<script>(function(){try{var t=localStorage.getItem('crcp-theme');document.documentElement.setAttribute('data-theme',t==='light'?'light':'dark');}catch(e){document.documentElement.setAttribute('data-theme','dark');}})();</script>
 <script>/* credential-safe fetch (2026-08-18): resolve EVERY relative fetch (with or without a leading slash) against a credential-free base so creds embedded in the page URL (http://user:pass@host/...) don't poison document.baseURI and throw "Request cannot be constructed from a URL that includes credentials". */(function(){var of=window.fetch,O=location.origin;window.fetch=function(u,o){try{if(typeof u==='string'){if(/^[a-z][a-z0-9+.-]*:/i.test(u)){var x=new URL(u);if(x.username||x.password){x.username='';x.password='';u=x.href;}}else{u=new URL(u,O+location.pathname+location.search).href;}}else if(u&&typeof u.url==='string'){var y=new URL(u.url,O+location.pathname+location.search);if(y.username||y.password){y.username='';y.password='';u=new Request(y.href,u);}}}catch(e){}return of.call(this,u,o);};try{if(location.href.indexOf('@')>=0){history.replaceState(null,'',location.pathname+location.search+location.hash);}}catch(e){}})();</script>
 <!-- Self-heal: nav-agent grid controls can persist a "removed"/"collapsed" state that hides the
      whole grid with no obvious way back. Clear it before nav-agent runs so a grid can never stay hidden. -->
@@ -99,6 +100,7 @@
   <link rel="stylesheet" href="/three-view.css">
   <script src="/three-view.js"></script>
   <link rel="stylesheet" href="/nav-agent/nav-agent.css"><!-- nav-agent -->
+  <link rel="stylesheet" href="/crcp-theme.css"><!-- CRCP day/night tokens: load LAST so html[data-theme] wins -->
 </head>
 <body>
 <header>
@@ -504,5 +506,6 @@ fetch('/api/brokers/all').then(r=>r.json()).then(d=>{DATA=d.brokers||[];autoCols
   <script src="/sort-bar.js" defer></script>
 <script src="/corner-nav.js" defer></script>
   <script src="/nav-agent/nav-agent.js" defer></script><!-- nav-agent -->
+  <script src="/crcp-theme.js" defer></script><!-- CRCP day/night toggle (auto-injects into header) -->
 </body>
 </html>
diff --git a/public/brokers.html b/public/brokers.html
index 1c321a2..589de51 100644
--- a/public/brokers.html
+++ b/public/brokers.html
@@ -1,6 +1,7 @@
 <!doctype html>
 <html lang="en">
 <head>
+<script>(function(){try{var t=localStorage.getItem('crcp-theme');document.documentElement.setAttribute('data-theme',t==='light'?'light':'dark');}catch(e){document.documentElement.setAttribute('data-theme','dark');}})();</script>
 <script>/* credential-safe fetch (2026-08-18): resolve EVERY relative fetch (with or without a leading slash) against a credential-free base so creds embedded in the page URL (http://user:pass@host/...) don't poison document.baseURI and throw "Request cannot be constructed from a URL that includes credentials". */(function(){var of=window.fetch,O=location.origin;window.fetch=function(u,o){try{if(typeof u==='string'){if(/^[a-z][a-z0-9+.-]*:/i.test(u)){var x=new URL(u);if(x.username||x.password){x.username='';x.password='';u=x.href;}}else{u=new URL(u,O+location.pathname+location.search).href;}}else if(u&&typeof u.url==='string'){var y=new URL(u.url,O+location.pathname+location.search);if(y.username||y.password){y.username='';y.password='';u=new Request(y.href,u);}}}catch(e){}return of.call(this,u,o);};try{if(location.href.indexOf('@')>=0){history.replaceState(null,'',location.pathname+location.search+location.hash);}}catch(e){}})();</script>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1">
@@ -42,6 +43,7 @@
   #detail{font-size:13px;} #detail .k{color:var(--mut);}
   .empty{padding:40px;color:var(--mut);text-align:center;}
 </style>
+  <link rel="stylesheet" href="/crcp-theme.css"><!-- CRCP day/night tokens: load LAST so html[data-theme] wins -->
 </head>
 <body>
 <header>
@@ -414,5 +416,6 @@ $('#firmq').oninput=()=>highlight($('#firmq').value);
 });
 </script>
 <script src="/corner-nav.js" defer></script>
+  <script src="/crcp-theme.js" defer></script><!-- CRCP day/night toggle (auto-injects into header) -->
 </body>
 </html>
diff --git a/public/condos.html b/public/condos.html
index 11899e6..3ed743b 100644
--- a/public/condos.html
+++ b/public/condos.html
@@ -1,6 +1,7 @@
 <!doctype html>
 <html lang="en">
 <head>
+<script>(function(){try{var t=localStorage.getItem('crcp-theme');document.documentElement.setAttribute('data-theme',t==='light'?'light':'dark');}catch(e){document.documentElement.setAttribute('data-theme','dark');}})();</script>
 <script>/* credential-safe fetch (2026-08-18): resolve EVERY relative fetch (with or without a leading slash) against a credential-free base so creds embedded in the page URL (http://user:pass@host/...) don't poison document.baseURI and throw "Request cannot be constructed from a URL that includes credentials". */(function(){var of=window.fetch,O=location.origin;window.fetch=function(u,o){try{if(typeof u==='string'){if(/^[a-z][a-z0-9+.-]*:/i.test(u)){var x=new URL(u);if(x.username||x.password){x.username='';x.password='';u=x.href;}}else{u=new URL(u,O+location.pathname+location.search).href;}}else if(u&&typeof u.url==='string'){var y=new URL(u.url,O+location.pathname+location.search);if(y.username||y.password){y.username='';y.password='';u=new Request(y.href,u);}}}catch(e){}return of.call(this,u,o);};try{if(location.href.indexOf('@')>=0){history.replaceState(null,'',location.pathname+location.search+location.hash);}}catch(e){}})();</script>
 <script>(function(){try{var t=localStorage.getItem('crcp-theme2');document.documentElement.setAttribute('data-theme',t==='dark'?'dark':'light');}catch(e){document.documentElement.setAttribute('data-theme','light');}})();</script>
 <!-- Self-heal: nav-agent grid controls can persist a "removed"/"collapsed" state that hides the
@@ -139,6 +140,7 @@
   <link rel="stylesheet" href="/three-view.css">
   <script src="/three-view.js"></script>
   <link rel="stylesheet" href="/nav-agent/nav-agent.css"><!-- nav-agent -->
+  <link rel="stylesheet" href="/crcp-theme.css"><!-- CRCP day/night tokens: load LAST so html[data-theme] wins -->
 </head>
 <body>
 <header>
@@ -853,5 +855,6 @@ boot();
   <script src="/sort-bar.js" defer></script>
 <script src="/corner-nav.js" defer></script>
   <script src="/nav-agent/nav-agent.js" defer></script><!-- nav-agent -->
+  <script src="/crcp-theme.js" defer></script><!-- CRCP day/night toggle (auto-injects into header) -->
 </body>
 </html>
diff --git a/public/contractors.html b/public/contractors.html
index 938b439..655439b 100644
--- a/public/contractors.html
+++ b/public/contractors.html
@@ -1,4 +1,5 @@
 <!doctype html><html lang="en"><head>
+<script>(function(){try{var t=localStorage.getItem('crcp-theme');document.documentElement.setAttribute('data-theme',t==='light'?'light':'dark');}catch(e){document.documentElement.setAttribute('data-theme','dark');}})();</script>
 <!-- Self-heal: nav-agent grid controls can persist a "removed"/"collapsed" state that hides the
      whole grid with no obvious way back. Clear it before nav-agent runs so a grid can never stay hidden. -->
 <script>(function(){try{for(var i=localStorage.length-1;i>=0;i--){var k=localStorage.key(i);if(k&&k.indexOf('navagent:')===0){var v=localStorage.getItem(k);if(v&&v.indexOf('"removed":true')>=0){localStorage.removeItem(k);}}}}catch(e){}})();</script>
@@ -73,6 +74,7 @@ input.dealf{background:var(--card);border:1px solid var(--line);color:var(--ink)
 .finance:hover{border-color:var(--blue)}
 @media(max-width:760px){.rail{display:none}}
 </style>  <link rel="stylesheet" href="/nav-agent/nav-agent.css"><!-- nav-agent -->
+  <link rel="stylesheet" href="/crcp-theme.css"><!-- CRCP day/night tokens: load LAST so html[data-theme] wins -->
 </head><body>
 <header>
   <h1><b>Contractors for this deal</b> · CSLB licensed</h1>
@@ -342,4 +344,5 @@ $('#body').addEventListener('click',e=>{
 </script>
 <script src="/corner-nav.js" defer></script>
   <script src="/nav-agent/nav-agent.js" defer></script><!-- nav-agent -->
+  <script src="/crcp-theme.js" defer></script><!-- CRCP day/night toggle (auto-injects into header) -->
 </body></html>
diff --git a/public/crcp.html b/public/crcp.html
index 33fa2da..d7a34f8 100644
--- a/public/crcp.html
+++ b/public/crcp.html
@@ -2,7 +2,7 @@
 <html lang="en">
 <head>
 <script>/* credential-safe fetch (2026-08-18): resolve EVERY relative fetch (with or without a leading slash) against a credential-free base so creds embedded in the page URL (http://user:pass@host/...) don't poison document.baseURI and throw "Request cannot be constructed from a URL that includes credentials". */(function(){var of=window.fetch,O=location.origin;window.fetch=function(u,o){try{if(typeof u==='string'){if(/^[a-z][a-z0-9+.-]*:/i.test(u)){var x=new URL(u);if(x.username||x.password){x.username='';x.password='';u=x.href;}}else{u=new URL(u,O+location.pathname+location.search).href;}}else if(u&&typeof u.url==='string'){var y=new URL(u.url,O+location.pathname+location.search);if(y.username||y.password){y.username='';y.password='';u=new Request(y.href,u);}}}catch(e){}return of.call(this,u,o);};try{if(location.href.indexOf('@')>=0){history.replaceState(null,'',location.pathname+location.search+location.hash);}}catch(e){}})();</script>
-<script>(function(){try{var t=localStorage.getItem('crcp-theme2');document.documentElement.setAttribute('data-theme',t==='dark'?'dark':'light');}catch(e){document.documentElement.setAttribute('data-theme','light');}})();</script>
+<script>(function(){try{var t=localStorage.getItem('crcp-theme');document.documentElement.setAttribute('data-theme',t==='dark'?'dark':'light');}catch(e){document.documentElement.setAttribute('data-theme','light');}})();</script>
 <!-- Self-heal: nav-agent grid controls can persist a "removed"/"collapsed" state that hides the
      whole grid with no obvious way back. Clear it before nav-agent runs so a grid can never stay hidden. -->
 <script>(function(){try{for(var i=localStorage.length-1;i>=0;i--){var k=localStorage.key(i);if(k&&k.indexOf('navagent:')===0){var v=localStorage.getItem(k);if(v&&v.indexOf('"removed":true')>=0){localStorage.removeItem(k);}}}}catch(e){}})();</script>
@@ -885,17 +885,17 @@ loadSegments(); setInterval(loadSegments, 20000);
 (function(){
   var root=document.documentElement;
   function applyTheme(t){ root.setAttribute('data-theme',t); }
-  var cur; try{ cur=localStorage.getItem('crcp-theme2'); }catch(e){}
+  var cur; try{ cur=localStorage.getItem('crcp-theme'); }catch(e){}
   applyTheme(cur==='dark'?'dark':'light');
   // Wire up the toggle button injected by crcp-theme.js (defer — may not exist yet;
-  // observe the header for it and intercept its click to persist crcp-theme2).
+  // observe the header for it and intercept its click to persist crcp-theme).
   function wireToggle(){
     var btn=document.getElementById('crcpThemeToggle'); if(!btn||btn.__wired2) return;
     btn.__wired2=true;
     btn.addEventListener('click',function(e){
       e.stopImmediatePropagation();   // suppress crcp-theme.js's own handler so we don't double-toggle
       var nt=root.getAttribute('data-theme')==='light'?'dark':'light';
-      applyTheme(nt); try{ localStorage.setItem('crcp-theme2',nt); }catch(e){}
+      applyTheme(nt); try{ localStorage.setItem('crcp-theme',nt); }catch(e){}
     },true);   // capture phase — fires before crcp-theme.js's own click handler
   }
   if(document.readyState==='loading') document.addEventListener('DOMContentLoaded',wireToggle); else wireToggle();
diff --git a/public/credit-unions.html b/public/credit-unions.html
index 2ba2916..35a537a 100644
--- a/public/credit-unions.html
+++ b/public/credit-unions.html
@@ -1,6 +1,7 @@
 <!doctype html>
 <html lang="en">
 <head>
+<script>(function(){try{var t=localStorage.getItem('crcp-theme');document.documentElement.setAttribute('data-theme',t==='light'?'light':'dark');}catch(e){document.documentElement.setAttribute('data-theme','dark');}})();</script>
 <!-- Self-heal: nav-agent grid controls can persist a "removed"/"collapsed" state that hides the
      whole grid with no obvious way back. Clear it before nav-agent runs so a grid can never stay hidden. -->
 <script>(function(){try{for(var i=localStorage.length-1;i>=0;i--){var k=localStorage.key(i);if(k&&k.indexOf('navagent:')===0){var v=localStorage.getItem(k);if(v&&v.indexOf('"removed":true')>=0){localStorage.removeItem(k);}}}}catch(e){}})();</script>
@@ -10,6 +11,7 @@
 <title>Credit Unions — with LA County offices (NCUA)</title>
 <link rel="stylesheet" href="/lending-grid.css">
   <link rel="stylesheet" href="/nav-agent/nav-agent.css"><!-- nav-agent -->
+  <link rel="stylesheet" href="/crcp-theme.css"><!-- CRCP day/night tokens: load LAST so html[data-theme] wins -->
 </head>
 <body>
 <header>
@@ -79,5 +81,6 @@ window.GRID_CONFIG = {
 <script src="/col-resize.js" defer></script>
 <script src="/corner-nav.js" defer></script>
   <script src="/nav-agent/nav-agent.js" defer></script><!-- nav-agent -->
+  <script src="/crcp-theme.js" defer></script><!-- CRCP day/night toggle (auto-injects into header) -->
 </body>
 </html>
diff --git a/public/deals-flow.html b/public/deals-flow.html
index 91a063f..bf27fb5 100644
--- a/public/deals-flow.html
+++ b/public/deals-flow.html
@@ -1,4 +1,5 @@
 <!doctype html><html lang="en"><head>
+<script>(function(){try{var t=localStorage.getItem('crcp-theme');document.documentElement.setAttribute('data-theme',t==='light'?'light':'dark');}catch(e){document.documentElement.setAttribute('data-theme','dark');}})();</script>
 <script>/* credential-safe fetch (2026-08-18): resolve EVERY relative fetch (with or without a leading slash) against a credential-free base so creds embedded in the page URL (http://user:pass@host/...) don't poison document.baseURI and throw "Request cannot be constructed from a URL that includes credentials". */(function(){var of=window.fetch,O=location.origin;window.fetch=function(u,o){try{if(typeof u==='string'){if(/^[a-z][a-z0-9+.-]*:/i.test(u)){var x=new URL(u);if(x.username||x.password){x.username='';x.password='';u=x.href;}}else{u=new URL(u,O+location.pathname+location.search).href;}}else if(u&&typeof u.url==='string'){var y=new URL(u.url,O+location.pathname+location.search);if(y.username||y.password){y.username='';y.password='';u=new Request(y.href,u);}}}catch(e){}return of.call(this,u,o);};try{if(location.href.indexOf('@')>=0){history.replaceState(null,'',location.pathname+location.search+location.hash);}}catch(e){}})();</script>
 <!-- Self-heal: nav-agent grid controls can persist a "removed"/"collapsed" state that hides the
      whole grid with no obvious way back. Clear it before nav-agent runs so a grid can never stay hidden. -->
@@ -103,6 +104,7 @@ select{background:var(--card);border:1px solid var(--line);color:var(--ink);bord
 .roleopt b{display:block;color:#fff;font-size:12.5px}
 .roleopt span{font-size:10px;color:var(--mut)}
 </style>  <link rel="stylesheet" href="/nav-agent/nav-agent.css"><!-- nav-agent -->
+  <link rel="stylesheet" href="/crcp-theme.css"><!-- CRCP day/night tokens: load LAST so html[data-theme] wins -->
 </head><body>
 <header>
   <h1><b>Closed Deal Flow</b> · LA Commercial</h1>
@@ -469,4 +471,5 @@ Promise.all([
 }).catch(()=>{$('#count').textContent='failed to load deal data';});
 </script><script src="/corner-nav.js" defer></script>
   <script src="/nav-agent/nav-agent.js" defer></script><!-- nav-agent -->
+  <script src="/crcp-theme.js" defer></script><!-- CRCP day/night toggle (auto-injects into header) -->
 </body></html>
diff --git a/public/deals.html b/public/deals.html
index 8cf2947..80ab844 100644
--- a/public/deals.html
+++ b/public/deals.html
@@ -1,6 +1,7 @@
 <!doctype html>
 <html lang="en">
 <head>
+<script>(function(){try{var t=localStorage.getItem('crcp-theme');document.documentElement.setAttribute('data-theme',t==='light'?'light':'dark');}catch(e){document.documentElement.setAttribute('data-theme','dark');}})();</script>
 <script>/* credential-safe fetch (2026-08-18): resolve EVERY relative fetch (with or without a leading slash) against a credential-free base so creds embedded in the page URL (http://user:pass@host/...) don't poison document.baseURI and throw "Request cannot be constructed from a URL that includes credentials". */(function(){var of=window.fetch,O=location.origin;window.fetch=function(u,o){try{if(typeof u==='string'){if(/^[a-z][a-z0-9+.-]*:/i.test(u)){var x=new URL(u);if(x.username||x.password){x.username='';x.password='';u=x.href;}}else{u=new URL(u,O+location.pathname+location.search).href;}}else if(u&&typeof u.url==='string'){var y=new URL(u.url,O+location.pathname+location.search);if(y.username||y.password){y.username='';y.password='';u=new Request(y.href,u);}}}catch(e){}return of.call(this,u,o);};try{if(location.href.indexOf('@')>=0){history.replaceState(null,'',location.pathname+location.search+location.hash);}}catch(e){}})();</script>
 <!-- Self-heal: nav-agent grid controls can persist a "removed"/"collapsed" state that hides the
      whole grid with no obvious way back. Clear it before nav-agent runs so a grid can never stay hidden. -->
@@ -100,6 +101,7 @@
   }
 </style>
   <link rel="stylesheet" href="/nav-agent/nav-agent.css"><!-- nav-agent -->
+  <link rel="stylesheet" href="/crcp-theme.css"><!-- CRCP day/night tokens: load LAST so html[data-theme] wins -->
 </head>
 <body>
 <div class="wrap">
@@ -297,5 +299,6 @@ pull();   // initial load
   <script src="/global-search.js" defer></script>
 <script src="/corner-nav.js" defer></script>
   <script src="/nav-agent/nav-agent.js" defer></script><!-- nav-agent -->
+  <script src="/crcp-theme.js" defer></script><!-- CRCP day/night toggle (auto-injects into header) -->
 </body>
 </html>
diff --git a/public/fha-leads.html b/public/fha-leads.html
index 5eb38db..2dbff48 100644
--- a/public/fha-leads.html
+++ b/public/fha-leads.html
@@ -1,4 +1,5 @@
 <!doctype html><html lang="en"><head>
+<script>(function(){try{var t=localStorage.getItem('crcp-theme');document.documentElement.setAttribute('data-theme',t==='light'?'light':'dark');}catch(e){document.documentElement.setAttribute('data-theme','dark');}})();</script>
 <script>/* credential-safe fetch (2026-08-18): resolve EVERY relative fetch (with or without a leading slash) against a credential-free base so creds embedded in the page URL (http://user:pass@host/...) don't poison document.baseURI and throw "Request cannot be constructed from a URL that includes credentials". */(function(){var of=window.fetch,O=location.origin;window.fetch=function(u,o){try{if(typeof u==='string'){if(/^[a-z][a-z0-9+.-]*:/i.test(u)){var x=new URL(u);if(x.username||x.password){x.username='';x.password='';u=x.href;}}else{u=new URL(u,O+location.pathname+location.search).href;}}else if(u&&typeof u.url==='string'){var y=new URL(u.url,O+location.pathname+location.search);if(y.username||y.password){y.username='';y.password='';u=new Request(y.href,u);}}}catch(e){}return of.call(this,u,o);};try{if(location.href.indexOf('@')>=0){history.replaceState(null,'',location.pathname+location.search+location.hash);}}catch(e){}})();</script>
 <!-- Self-heal: nav-agent grid controls can persist a "removed"/"collapsed" state that hides the
      whole grid with no obvious way back. Clear it before nav-agent runs so a grid can never stay hidden. -->
@@ -52,6 +53,7 @@ tr:hover td{background:#131922}
 .fcard-kv div{display:flex;justify-content:space-between;gap:8px;border-bottom:1px solid #20262f;padding-bottom:3px}
 .fcard-kv em{color:var(--mut);font-size:10px;text-transform:uppercase;letter-spacing:.3px;font-style:normal}
 </style>  <link rel="stylesheet" href="/three-view.css"><link rel="stylesheet" href="/nav-agent/nav-agent.css"><!-- nav-agent -->
+  <link rel="stylesheet" href="/crcp-theme.css"><!-- CRCP day/night tokens: load LAST so html[data-theme] wins -->
 </head><body>
 <header>
   <h1><b>Assumable-Loan Leads</b> · FHA Multifamily</h1>
@@ -202,4 +204,5 @@ fetch('/data/fha-loans.json').then(r=>r.json()).then(j=>{DATA=(j.rows||[]).filte
 </script><script src="/corner-nav.js" defer></script>
   <script src="/nav-agent/nav-agent.js" defer></script><!-- nav-agent -->
   <script src="/filter-modal.js" defer></script><!-- filters → collapsed modal panels -->
+  <script src="/crcp-theme.js" defer></script><!-- CRCP day/night toggle (auto-injects into header) -->
 </body></html>
diff --git a/public/gov-agents.html b/public/gov-agents.html
index acbc693..44779b0 100644
--- a/public/gov-agents.html
+++ b/public/gov-agents.html
@@ -1,6 +1,7 @@
 <!doctype html>
 <html lang="en">
 <head>
+<script>(function(){try{var t=localStorage.getItem('crcp-theme');document.documentElement.setAttribute('data-theme',t==='light'?'light':'dark');}catch(e){document.documentElement.setAttribute('data-theme','dark');}})();</script>
 <script>/* credential-safe fetch (2026-08-18): resolve EVERY relative fetch (with or without a leading slash) against a credential-free base so creds embedded in the page URL (http://user:pass@host/...) don't poison document.baseURI and throw "Request cannot be constructed from a URL that includes credentials". */(function(){var of=window.fetch,O=location.origin;window.fetch=function(u,o){try{if(typeof u==='string'){if(/^[a-z][a-z0-9+.-]*:/i.test(u)){var x=new URL(u);if(x.username||x.password){x.username='';x.password='';u=x.href;}}else{u=new URL(u,O+location.pathname+location.search).href;}}else if(u&&typeof u.url==='string'){var y=new URL(u.url,O+location.pathname+location.search);if(y.username||y.password){y.username='';y.password='';u=new Request(y.href,u);}}}catch(e){}return of.call(this,u,o);};try{if(location.href.indexOf('@')>=0){history.replaceState(null,'',location.pathname+location.search+location.hash);}}catch(e){}})();</script>
 <!-- Self-heal: nav-agent grid controls can persist a "removed"/"collapsed" state that hides the
      whole grid with no obvious way back. Clear it before nav-agent runs so a grid can never stay hidden. -->
@@ -67,6 +68,7 @@
   #modal .litem{display:flex;justify-content:space-between;gap:12px;padding:5px 0;border-bottom:1px solid #20262f;font-size:13px;} #modal .litem .m{color:var(--mut);}
 </style>
   <link rel="stylesheet" href="/nav-agent/nav-agent.css"><!-- nav-agent -->
+  <link rel="stylesheet" href="/crcp-theme.css"><!-- CRCP day/night tokens: load LAST so html[data-theme] wins -->
 </head>
 <body>
 <header>
@@ -307,5 +309,6 @@ loadIndex();
   <script src="/col-resize.js" defer></script>
 <script src="/corner-nav.js" defer></script>
   <script src="/nav-agent/nav-agent.js" defer></script><!-- nav-agent -->
+  <script src="/crcp-theme.js" defer></script><!-- CRCP day/night toggle (auto-injects into header) -->
 </body>
 </html>
diff --git a/public/lenders.html b/public/lenders.html
index b727273..365feeb 100644
--- a/public/lenders.html
+++ b/public/lenders.html
@@ -1,6 +1,7 @@
 <!doctype html>
 <html lang="en">
 <head>
+<script>(function(){try{var t=localStorage.getItem('crcp-theme');document.documentElement.setAttribute('data-theme',t==='light'?'light':'dark');}catch(e){document.documentElement.setAttribute('data-theme','dark');}})();</script>
 <!-- Self-heal: nav-agent grid controls can persist a "removed"/"collapsed" state that hides the
      whole grid with no obvious way back. Clear it before nav-agent runs so a grid can never stay hidden. -->
 <script>(function(){try{for(var i=localStorage.length-1;i>=0;i--){var k=localStorage.key(i);if(k&&k.indexOf('navagent:')===0){var v=localStorage.getItem(k);if(v&&v.indexOf('"removed":true')>=0){localStorage.removeItem(k);}}}}catch(e){}})();</script>
@@ -10,6 +11,7 @@
 <title>Lenders — Banks with LA County branches (FDIC)</title>
 <link rel="stylesheet" href="/lending-grid.css">
   <link rel="stylesheet" href="/nav-agent/nav-agent.css"><!-- nav-agent -->
+  <link rel="stylesheet" href="/crcp-theme.css"><!-- CRCP day/night tokens: load LAST so html[data-theme] wins -->
 </head>
 <body>
 <header>
@@ -82,5 +84,6 @@ window.GRID_CONFIG = {
 <script src="/col-resize.js" defer></script>
 <script src="/corner-nav.js" defer></script>
   <script src="/nav-agent/nav-agent.js" defer></script><!-- nav-agent -->
+  <script src="/crcp-theme.js" defer></script><!-- CRCP day/night toggle (auto-injects into header) -->
 </body>
 </html>
diff --git a/public/lending.html b/public/lending.html
index 5c69d91..23be34e 100644
--- a/public/lending.html
+++ b/public/lending.html
@@ -1,6 +1,7 @@
 <!doctype html>
 <html lang="en">
 <head>
+<script>(function(){try{var t=localStorage.getItem('crcp-theme');document.documentElement.setAttribute('data-theme',t==='light'?'light':'dark');}catch(e){document.documentElement.setAttribute('data-theme','dark');}})();</script>
 <script>/* credential-safe fetch (2026-08-18): resolve EVERY relative fetch (with or without a leading slash) against a credential-free base so creds embedded in the page URL (http://user:pass@host/...) don't poison document.baseURI and throw "Request cannot be constructed from a URL that includes credentials". */(function(){var of=window.fetch,O=location.origin;window.fetch=function(u,o){try{if(typeof u==='string'){if(/^[a-z][a-z0-9+.-]*:/i.test(u)){var x=new URL(u);if(x.username||x.password){x.username='';x.password='';u=x.href;}}else{u=new URL(u,O+location.pathname+location.search).href;}}else if(u&&typeof u.url==='string'){var y=new URL(u.url,O+location.pathname+location.search);if(y.username||y.password){y.username='';y.password='';u=new Request(y.href,u);}}}catch(e){}return of.call(this,u,o);};try{if(location.href.indexOf('@')>=0){history.replaceState(null,'',location.pathname+location.search+location.hash);}}catch(e){}})();</script>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1">
@@ -23,6 +24,7 @@
   .note a{color:var(--blue);}
   .pub{color:var(--acc);border:1px solid rgba(112,173,71,.5);border-radius:8px;padding:2px 9px;font-size:11px;text-transform:uppercase;letter-spacing:.4px;}
 </style>
+  <link rel="stylesheet" href="/crcp-theme.css"><!-- CRCP day/night tokens: load LAST so html[data-theme] wins -->
 </head>
 <body>
 <header>
@@ -99,5 +101,6 @@ async function counts(){
 counts();
 </script>
 <script src="/corner-nav.js" defer></script>
+  <script src="/crcp-theme.js" defer></script><!-- CRCP day/night toggle (auto-injects into header) -->
 </body>
 </html>
diff --git a/public/licensed-agents.html b/public/licensed-agents.html
index 70a4d13..e2b709e 100644
--- a/public/licensed-agents.html
+++ b/public/licensed-agents.html
@@ -1,6 +1,7 @@
 <!doctype html>
 <html lang="en">
 <head>
+<script>(function(){try{var t=localStorage.getItem('crcp-theme');document.documentElement.setAttribute('data-theme',t==='light'?'light':'dark');}catch(e){document.documentElement.setAttribute('data-theme','dark');}})();</script>
 <script>/* credential-safe fetch (2026-08-18): resolve EVERY relative fetch (with or without a leading slash) against a credential-free base so creds embedded in the page URL (http://user:pass@host/...) don't poison document.baseURI and throw "Request cannot be constructed from a URL that includes credentials". */(function(){var of=window.fetch,O=location.origin;window.fetch=function(u,o){try{if(typeof u==='string'){if(/^[a-z][a-z0-9+.-]*:/i.test(u)){var x=new URL(u);if(x.username||x.password){x.username='';x.password='';u=x.href;}}else{u=new URL(u,O+location.pathname+location.search).href;}}else if(u&&typeof u.url==='string'){var y=new URL(u.url,O+location.pathname+location.search);if(y.username||y.password){y.username='';y.password='';u=new Request(y.href,u);}}}catch(e){}return of.call(this,u,o);};try{if(location.href.indexOf('@')>=0){history.replaceState(null,'',location.pathname+location.search+location.hash);}}catch(e){}})();</script>
 <!-- Self-heal: nav-agent grid controls can persist a "removed"/"collapsed" state that hides the
      whole grid with no obvious way back. Clear it before nav-agent runs so a grid can never stay hidden. -->
@@ -65,6 +66,7 @@
   #modal .kv .k{color:var(--mut);} #modal .kv .v a{color:var(--blue);text-decoration:none;}
 </style>
   <link rel="stylesheet" href="/nav-agent/nav-agent.css"><!-- nav-agent -->
+  <link rel="stylesheet" href="/crcp-theme.css"><!-- CRCP day/night tokens: load LAST so html[data-theme] wins -->
 </head>
 <body>
 <header>
@@ -289,5 +291,6 @@ if(localStorage.getItem('laMode')==='brokers') setMode('brokers'); else { $('#fi
   <script src="/col-resize.js" defer></script>
 <script src="/corner-nav.js" defer></script>
   <script src="/nav-agent/nav-agent.js" defer></script><!-- nav-agent -->
+  <script src="/crcp-theme.js" defer></script><!-- CRCP day/night toggle (auto-injects into header) -->
 </body>
 </html>
diff --git a/public/licensed.html b/public/licensed.html
index 4d85850..59abc59 100644
--- a/public/licensed.html
+++ b/public/licensed.html
@@ -1,4 +1,5 @@
 <!doctype html><html lang="en"><head>
+<script>(function(){try{var t=localStorage.getItem('crcp-theme');document.documentElement.setAttribute('data-theme',t==='light'?'light':'dark');}catch(e){document.documentElement.setAttribute('data-theme','dark');}})();</script>
 <script>/* credential-safe fetch (2026-08-18): resolve EVERY relative fetch (with or without a leading slash) against a credential-free base so creds embedded in the page URL (http://user:pass@host/...) don't poison document.baseURI and throw "Request cannot be constructed from a URL that includes credentials". */(function(){var of=window.fetch,O=location.origin;window.fetch=function(u,o){try{if(typeof u==='string'){if(/^[a-z][a-z0-9+.-]*:/i.test(u)){var x=new URL(u);if(x.username||x.password){x.username='';x.password='';u=x.href;}}else{u=new URL(u,O+location.pathname+location.search).href;}}else if(u&&typeof u.url==='string'){var y=new URL(u.url,O+location.pathname+location.search);if(y.username||y.password){y.username='';y.password='';u=new Request(y.href,u);}}}catch(e){}return of.call(this,u,o);};try{if(location.href.indexOf('@')>=0){history.replaceState(null,'',location.pathname+location.search+location.hash);}}catch(e){}})();</script>
 <!-- Self-heal: nav-agent grid controls can persist a "removed"/"collapsed" state that hides the
      whole grid with no obvious way back. Clear it before nav-agent runs so a grid can never stay hidden. -->
@@ -58,6 +59,7 @@ input#q{min-width:230px}
 #modal .mrow{display:flex;justify-content:space-between;gap:12px;padding:5px 0;border-bottom:1px solid var(--line);font-size:13px}
 #modal .mrow .mk{color:var(--mut);text-transform:capitalize}#modal .mrow .mv{text-align:right;word-break:break-word}
 </style>  <link rel="stylesheet" href="/nav-agent/nav-agent.css"><!-- nav-agent -->
+  <link rel="stylesheet" href="/crcp-theme.css"><!-- CRCP day/night tokens: load LAST so html[data-theme] wins -->
 </head><body>
 <header>
   <div><h1>📋 Licensed Directory <span class="sub" id="scope"></span></h1></div>
@@ -216,4 +218,5 @@ boot().catch(e=>{$('#count').textContent='Failed to load: '+e.message;});
   <script src="/sort-bar.js" defer></script>
 <script src="/corner-nav.js" defer></script>
   <script src="/nav-agent/nav-agent.js" defer></script><!-- nav-agent -->
+  <script src="/crcp-theme.js" defer></script><!-- CRCP day/night toggle (auto-injects into header) -->
 </body></html>
diff --git a/public/linkedin.html b/public/linkedin.html
index 8ec9ea2..e247f54 100644
--- a/public/linkedin.html
+++ b/public/linkedin.html
@@ -1,6 +1,7 @@
 <!doctype html>
 <html lang="en">
 <head>
+<script>(function(){try{var t=localStorage.getItem('crcp-theme');document.documentElement.setAttribute('data-theme',t==='light'?'light':'dark');}catch(e){document.documentElement.setAttribute('data-theme','dark');}})();</script>
 <script>/* credential-safe fetch (2026-08-18): resolve EVERY relative fetch (with or without a leading slash) against a credential-free base so creds embedded in the page URL (http://user:pass@host/...) don't poison document.baseURI and throw "Request cannot be constructed from a URL that includes credentials". */(function(){var of=window.fetch,O=location.origin;window.fetch=function(u,o){try{if(typeof u==='string'){if(/^[a-z][a-z0-9+.-]*:/i.test(u)){var x=new URL(u);if(x.username||x.password){x.username='';x.password='';u=x.href;}}else{u=new URL(u,O+location.pathname+location.search).href;}}else if(u&&typeof u.url==='string'){var y=new URL(u.url,O+location.pathname+location.search);if(y.username||y.password){y.username='';y.password='';u=new Request(y.href,u);}}}catch(e){}return of.call(this,u,o);};try{if(location.href.indexOf('@')>=0){history.replaceState(null,'',location.pathname+location.search+location.hash);}}catch(e){}})();</script>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1">
@@ -59,6 +60,7 @@
   #modal .mact{display:flex;gap:10px;margin-top:14px;flex-wrap:wrap;}
   @media(max-width:680px){ header{flex-wrap:wrap;} header .nav{flex-wrap:wrap;gap:10px;width:100%;} .row{flex-wrap:wrap;} .row .lc{order:5;width:100%;} }
 </style>
+  <link rel="stylesheet" href="/crcp-theme.css"><!-- CRCP day/night tokens: load LAST so html[data-theme] wins -->
 </head>
 <body>
 <header>
@@ -248,5 +250,6 @@ document.addEventListener('keydown',e=>{ if(e.key==='Escape') $('#ov').classList
 load();
 </script>
 <script src="/corner-nav.js" defer></script>
+  <script src="/crcp-theme.js" defer></script><!-- CRCP day/night toggle (auto-injects into header) -->
 </body>
 </html>
diff --git a/public/loan-officers.html b/public/loan-officers.html
index c612a00..947bca3 100644
--- a/public/loan-officers.html
+++ b/public/loan-officers.html
@@ -1,6 +1,7 @@
 <!doctype html>
 <html lang="en">
 <head>
+<script>(function(){try{var t=localStorage.getItem('crcp-theme');document.documentElement.setAttribute('data-theme',t==='light'?'light':'dark');}catch(e){document.documentElement.setAttribute('data-theme','dark');}})();</script>
 <script>/* credential-safe fetch (2026-08-18): resolve EVERY relative fetch (with or without a leading slash) against a credential-free base so creds embedded in the page URL (http://user:pass@host/...) don't poison document.baseURI and throw "Request cannot be constructed from a URL that includes credentials". */(function(){var of=window.fetch,O=location.origin;window.fetch=function(u,o){try{if(typeof u==='string'){if(/^[a-z][a-z0-9+.-]*:/i.test(u)){var x=new URL(u);if(x.username||x.password){x.username='';x.password='';u=x.href;}}else{u=new URL(u,O+location.pathname+location.search).href;}}else if(u&&typeof u.url==='string'){var y=new URL(u.url,O+location.pathname+location.search);if(y.username||y.password){y.username='';y.password='';u=new Request(y.href,u);}}}catch(e){}return of.call(this,u,o);};try{if(location.href.indexOf('@')>=0){history.replaceState(null,'',location.pathname+location.search+location.hash);}}catch(e){}})();</script>
 <!-- Self-heal: nav-agent grid controls can persist a "removed"/"collapsed" state that hides the
      whole grid with no obvious way back. Clear it before nav-agent runs so a grid can never stay hidden. -->
@@ -17,6 +18,7 @@
   .empty{margin:20px;padding:40px 24px;text-align:center;color:var(--mut);border:1px dashed var(--line);border-radius:12px;}
 </style>
   <link rel="stylesheet" href="/nav-agent/nav-agent.css"><!-- nav-agent -->
+  <link rel="stylesheet" href="/crcp-theme.css"><!-- CRCP day/night tokens: load LAST so html[data-theme] wins -->
 </head>
 <body>
 <header>
@@ -91,5 +93,6 @@ fetch('/api/lending/loan-officers', { credentials:'same-origin' }).then(r=>r.jso
 </script>
 <script src="/corner-nav.js" defer></script>
   <script src="/nav-agent/nav-agent.js" defer></script><!-- nav-agent -->
+  <script src="/crcp-theme.js" defer></script><!-- CRCP day/night toggle (auto-injects into header) -->
 </body>
 </html>
diff --git a/public/map.html b/public/map.html
index 2a62908..805ee85 100644
--- a/public/map.html
+++ b/public/map.html
@@ -1,6 +1,7 @@
 <!doctype html>
 <html lang="en">
 <head>
+<script>(function(){try{var t=localStorage.getItem('crcp-theme');document.documentElement.setAttribute('data-theme',t==='light'?'light':'dark');}catch(e){document.documentElement.setAttribute('data-theme','dark');}})();</script>
 <script>/* credential-safe fetch (2026-08-18): resolve EVERY relative fetch (with or without a leading slash) against a credential-free base so creds embedded in the page URL (http://user:pass@host/...) don't poison document.baseURI and throw "Request cannot be constructed from a URL that includes credentials". */(function(){var of=window.fetch,O=location.origin;window.fetch=function(u,o){try{if(typeof u==='string'){if(/^[a-z][a-z0-9+.-]*:/i.test(u)){var x=new URL(u);if(x.username||x.password){x.username='';x.password='';u=x.href;}}else{u=new URL(u,O+location.pathname+location.search).href;}}else if(u&&typeof u.url==='string'){var y=new URL(u.url,O+location.pathname+location.search);if(y.username||y.password){y.username='';y.password='';u=new Request(y.href,u);}}}catch(e){}return of.call(this,u,o);};try{if(location.href.indexOf('@')>=0){history.replaceState(null,'',location.pathname+location.search+location.hash);}}catch(e){}})();</script>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1">
@@ -46,6 +47,7 @@
   .pop .links{display:flex;gap:10px;flex-wrap:wrap;margin-top:5px;}
   .aerialcap{font-size:10px;color:var(--muted);margin-top:-3px;}
 </style>
+  <link rel="stylesheet" href="/crcp-theme.css"><!-- CRCP day/night tokens: load LAST so html[data-theme] wins -->
 </head>
 <body>
 <div class="topbar">
@@ -272,5 +274,6 @@ function buildLegend(){
 })();
 </script>
 <script src="/corner-nav.js" defer></script>
+  <script src="/crcp-theme.js" defer></script><!-- CRCP day/night toggle (auto-injects into header) -->
 </body>
 </html>
diff --git a/public/mortgage-market.html b/public/mortgage-market.html
index f64c726..46fc48a 100644
--- a/public/mortgage-market.html
+++ b/public/mortgage-market.html
@@ -1,6 +1,7 @@
 <!doctype html>
 <html lang="en">
 <head>
+<script>(function(){try{var t=localStorage.getItem('crcp-theme');document.documentElement.setAttribute('data-theme',t==='light'?'light':'dark');}catch(e){document.documentElement.setAttribute('data-theme','dark');}})();</script>
 <!-- Self-heal: nav-agent grid controls can persist a "removed"/"collapsed" state that hides the
      whole grid with no obvious way back. Clear it before nav-agent runs so a grid can never stay hidden. -->
 <script>(function(){try{for(var i=localStorage.length-1;i>=0;i--){var k=localStorage.key(i);if(k&&k.indexOf('navagent:')===0){var v=localStorage.getItem(k);if(v&&v.indexOf('"removed":true')>=0){localStorage.removeItem(k);}}}}catch(e){}})();</script>
@@ -10,6 +11,7 @@
 <title>Residential Mortgage Market — LA County lenders (CFPB / HMDA)</title>
 <link rel="stylesheet" href="/lending-grid.css">
   <link rel="stylesheet" href="/nav-agent/nav-agent.css"><!-- nav-agent -->
+  <link rel="stylesheet" href="/crcp-theme.css"><!-- CRCP day/night tokens: load LAST so html[data-theme] wins -->
 </head>
 <body>
 <header>
@@ -71,5 +73,6 @@ window.GRID_CONFIG = {
 <script src="/col-resize.js" defer></script>
 <script src="/corner-nav.js" defer></script>
   <script src="/nav-agent/nav-agent.js" defer></script><!-- nav-agent -->
+  <script src="/crcp-theme.js" defer></script><!-- CRCP day/night toggle (auto-injects into header) -->
 </body>
 </html>
diff --git a/public/parcel.html b/public/parcel.html
index 1a9bcb8..c4bc2af 100644
--- a/public/parcel.html
+++ b/public/parcel.html
@@ -1,4 +1,5 @@
 <!doctype html><html lang="en"><head>
+<script>(function(){try{var t=localStorage.getItem('crcp-theme');document.documentElement.setAttribute('data-theme',t==='light'?'light':'dark');}catch(e){document.documentElement.setAttribute('data-theme','dark');}})();</script>
 <script>/* credential-safe fetch (2026-08-18): resolve EVERY relative fetch (with or without a leading slash) against a credential-free base so creds embedded in the page URL (http://user:pass@host/...) don't poison document.baseURI and throw "Request cannot be constructed from a URL that includes credentials". */(function(){var of=window.fetch,O=location.origin;window.fetch=function(u,o){try{if(typeof u==='string'){if(/^[a-z][a-z0-9+.-]*:/i.test(u)){var x=new URL(u);if(x.username||x.password){x.username='';x.password='';u=x.href;}}else{u=new URL(u,O+location.pathname+location.search).href;}}else if(u&&typeof u.url==='string'){var y=new URL(u.url,O+location.pathname+location.search);if(y.username||y.password){y.username='';y.password='';u=new Request(y.href,u);}}}catch(e){}return of.call(this,u,o);};try{if(location.href.indexOf('@')>=0){history.replaceState(null,'',location.pathname+location.search+location.hash);}}catch(e){}})();</script>
 <!-- Self-heal: nav-agent grid controls can persist a "removed"/"collapsed" state that hides the
      whole grid with no obvious way back. Clear it before nav-agent runs so a grid can never stay hidden. -->
@@ -43,6 +44,7 @@ a.ext{color:var(--blue);text-decoration:none}a.ext:hover{text-decoration:underli
 .loading{color:var(--mut);padding:40px 0}
 .err{color:var(--bad);padding:24px 0}
 </style>  <link rel="stylesheet" href="/nav-agent/nav-agent.css"><!-- nav-agent -->
+  <link rel="stylesheet" href="/crcp-theme.css"><!-- CRCP day/night tokens: load LAST so html[data-theme] wins -->
 </head><body data-nav-agent="off"><!-- nav-agent off (TK-10525): single-parcel DETAIL dossier (#out), no browsable grid -->
 <header>
   <h1><b>Parcel Detail</b> · CRCP</h1>
@@ -160,4 +162,5 @@ load();
 </script>
 <script src="/corner-nav.js" defer></script>
   <script src="/nav-agent/nav-agent.js" defer></script><!-- nav-agent -->
+  <script src="/crcp-theme.js" defer></script><!-- CRCP day/night toggle (auto-injects into header) -->
 </body></html>
diff --git a/public/property.html b/public/property.html
index c007e98..f87e3c5 100644
--- a/public/property.html
+++ b/public/property.html
@@ -1,6 +1,7 @@
 <!doctype html>
 <html lang="en">
 <head>
+<script>(function(){try{var t=localStorage.getItem('crcp-theme');document.documentElement.setAttribute('data-theme',t==='light'?'light':'dark');}catch(e){document.documentElement.setAttribute('data-theme','dark');}})();</script>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1">
 <title>Property Lookup · CRCP</title>
@@ -27,6 +28,7 @@
   .pdpick:hover{border-color:var(--accent)}
   .rail{color:var(--mut);font-size:11px;margin-top:22px;border-top:1px solid var(--line);padding-top:12px}
 </style>
+  <link rel="stylesheet" href="/crcp-theme.css"><!-- CRCP day/night tokens: load LAST so html[data-theme] wins -->
 </head>
 <body>
 <header>
@@ -94,5 +96,7 @@ $('#out').addEventListener('click',e=>{const pk=e.target.closest('.pdpick');if(p
 // deep-link: /property?q=... or /property?ain=... runs the lookup on load (bookmarkable)
 (function(){const p=new URLSearchParams(location.search),v=p.get('ain')||p.get('q');if(v){$('#q').value=v;lookup(v);}})();
 </script>
+  <script src="/crcp-theme.js" defer></script><!-- CRCP day/night toggle (auto-injects into header) -->
+  <script src="/corner-nav.js" defer></script>
 </body>
 </html>
diff --git a/public/rent-rolls.html b/public/rent-rolls.html
index 580001f..4c67d50 100644
--- a/public/rent-rolls.html
+++ b/public/rent-rolls.html
@@ -1,6 +1,7 @@
 <!doctype html>
 <html lang="en">
 <head>
+<script>(function(){try{var t=localStorage.getItem('crcp-theme');document.documentElement.setAttribute('data-theme',t==='light'?'light':'dark');}catch(e){document.documentElement.setAttribute('data-theme','dark');}})();</script>
 <script>/* credential-safe fetch (2026-08-18): resolve EVERY relative fetch (with or without a leading slash) against a credential-free base so creds embedded in the page URL (http://user:pass@host/...) don't poison document.baseURI and throw "Request cannot be constructed from a URL that includes credentials". */(function(){var of=window.fetch,O=location.origin;window.fetch=function(u,o){try{if(typeof u==='string'){if(/^[a-z][a-z0-9+.-]*:/i.test(u)){var x=new URL(u);if(x.username||x.password){x.username='';x.password='';u=x.href;}}else{u=new URL(u,O+location.pathname+location.search).href;}}else if(u&&typeof u.url==='string'){var y=new URL(u.url,O+location.pathname+location.search);if(y.username||y.password){y.username='';y.password='';u=new Request(y.href,u);}}}catch(e){}return of.call(this,u,o);};try{if(location.href.indexOf('@')>=0){history.replaceState(null,'',location.pathname+location.search+location.hash);}}catch(e){}})();</script>
 <!-- Self-heal: nav-agent grid controls can persist a "removed"/"collapsed" state that hides the
      whole grid with no obvious way back. Clear it before nav-agent runs so a grid can never stay hidden. -->
@@ -115,6 +116,7 @@
   .hide{display:none;}
 </style>
   <link rel="stylesheet" href="/nav-agent/nav-agent.css"><!-- nav-agent -->
+  <link rel="stylesheet" href="/crcp-theme.css"><!-- CRCP day/night tokens: load LAST so html[data-theme] wins -->
 </head>
 <body>
 <div class="wrap">
@@ -441,5 +443,6 @@ fetch('/api/rent-rolls').then(r=>r.json()).then(d=>{
   <script src="/sort-bar.js" defer></script>
 <script src="/corner-nav.js" defer></script>
   <script src="/nav-agent/nav-agent.js" defer></script><!-- nav-agent -->
+  <script src="/crcp-theme.js" defer></script><!-- CRCP day/night toggle (auto-injects into header) -->
 </body>
 </html>
diff --git a/public/residential-brokers.html b/public/residential-brokers.html
index a0d8dd8..9edc505 100644
--- a/public/residential-brokers.html
+++ b/public/residential-brokers.html
@@ -1,6 +1,7 @@
 <!doctype html>
 <html lang="en">
 <head>
+<script>(function(){try{var t=localStorage.getItem('crcp-theme');document.documentElement.setAttribute('data-theme',t==='light'?'light':'dark');}catch(e){document.documentElement.setAttribute('data-theme','dark');}})();</script>
 <script>/* credential-safe fetch (2026-08-18): resolve EVERY relative fetch (with or without a leading slash) against a credential-free base so creds embedded in the page URL (http://user:pass@host/...) don't poison document.baseURI and throw "Request cannot be constructed from a URL that includes credentials". */(function(){var of=window.fetch,O=location.origin;window.fetch=function(u,o){try{if(typeof u==='string'){if(/^[a-z][a-z0-9+.-]*:/i.test(u)){var x=new URL(u);if(x.username||x.password){x.username='';x.password='';u=x.href;}}else{u=new URL(u,O+location.pathname+location.search).href;}}else if(u&&typeof u.url==='string'){var y=new URL(u.url,O+location.pathname+location.search);if(y.username||y.password){y.username='';y.password='';u=new Request(y.href,u);}}}catch(e){}return of.call(this,u,o);};try{if(location.href.indexOf('@')>=0){history.replaceState(null,'',location.pathname+location.search+location.hash);}}catch(e){}})();</script>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1">
@@ -32,6 +33,7 @@
   .pill{display:inline-block;font-size:10px;padding:1px 7px;border-radius:10px;background:#1a2130;color:var(--muted);border:1px solid var(--line);margin-top:6px}
   .empty{color:var(--muted);padding:40px;text-align:center}
 </style>
+  <link rel="stylesheet" href="/crcp-theme.css"><!-- CRCP day/night tokens: load LAST so html[data-theme] wins -->
 </head>
 <body>
 <header>
@@ -126,5 +128,6 @@ $('sort').onchange=e=>{ state.sort=e.target.value; save(); draw(); };
 $('dens').oninput=e=>{ state.cols=+e.target.value; save(); draw(); };
 renderToggles(); load();
 </script>
+  <script src="/crcp-theme.js" defer></script><!-- CRCP day/night toggle (auto-injects into header) -->
 </body>
 </html>
diff --git a/public/sales.html b/public/sales.html
index 76a3017..575cbbd 100644
--- a/public/sales.html
+++ b/public/sales.html
@@ -1,6 +1,7 @@
 <!doctype html>
 <html lang="en">
 <head>
+<script>(function(){try{var t=localStorage.getItem('crcp-theme');document.documentElement.setAttribute('data-theme',t==='light'?'light':'dark');}catch(e){document.documentElement.setAttribute('data-theme','dark');}})();</script>
 <script>/* credential-safe fetch (2026-08-18): resolve EVERY relative fetch (with or without a leading slash) against a credential-free base so creds embedded in the page URL (http://user:pass@host/...) don't poison document.baseURI and throw "Request cannot be constructed from a URL that includes credentials". */(function(){var of=window.fetch,O=location.origin;window.fetch=function(u,o){try{if(typeof u==='string'){if(/^[a-z][a-z0-9+.-]*:/i.test(u)){var x=new URL(u);if(x.username||x.password){x.username='';x.password='';u=x.href;}}else{u=new URL(u,O+location.pathname+location.search).href;}}else if(u&&typeof u.url==='string'){var y=new URL(u.url,O+location.pathname+location.search);if(y.username||y.password){y.username='';y.password='';u=new Request(y.href,u);}}}catch(e){}return of.call(this,u,o);};try{if(location.href.indexOf('@')>=0){history.replaceState(null,'',location.pathname+location.search+location.hash);}}catch(e){}})();</script>
 <!-- Self-heal: nav-agent grid controls can persist a "removed"/"collapsed" state that hides the
      whole grid with no obvious way back. Clear it before nav-agent runs so a grid can never stay hidden. -->
@@ -89,6 +90,7 @@
   .rail .rsec.collapsed > *:not(h4) { display:none !important; }
 </style>
   <link rel="stylesheet" href="/nav-agent/nav-agent.css"><!-- nav-agent -->
+  <link rel="stylesheet" href="/crcp-theme.css"><!-- CRCP day/night tokens: load LAST so html[data-theme] wins -->
 </head>
 <body>
 <header>
@@ -418,5 +420,6 @@ fetch('/api/closed-sales?limit=5000').then(r=>r.json()).then(d=>{
   <script src="/sort-bar.js" defer></script>
 <script src="/corner-nav.js" defer></script>
   <script src="/nav-agent/nav-agent.js" defer></script><!-- nav-agent -->
+  <script src="/crcp-theme.js" defer></script><!-- CRCP day/night toggle (auto-injects into header) -->
 </body>
 </html>
diff --git a/public/sba-lenders.html b/public/sba-lenders.html
index cd96175..0bcad64 100644
--- a/public/sba-lenders.html
+++ b/public/sba-lenders.html
@@ -1,6 +1,7 @@
 <!doctype html>
 <html lang="en">
 <head>
+<script>(function(){try{var t=localStorage.getItem('crcp-theme');document.documentElement.setAttribute('data-theme',t==='light'?'light':'dark');}catch(e){document.documentElement.setAttribute('data-theme','dark');}})();</script>
 <!-- Self-heal: nav-agent grid controls can persist a "removed"/"collapsed" state that hides the
      whole grid with no obvious way back. Clear it before nav-agent runs so a grid can never stay hidden. -->
 <script>(function(){try{for(var i=localStorage.length-1;i>=0;i--){var k=localStorage.key(i);if(k&&k.indexOf('navagent:')===0){var v=localStorage.getItem(k);if(v&&v.indexOf('"removed":true')>=0){localStorage.removeItem(k);}}}}catch(e){}})();</script>
@@ -10,6 +11,7 @@
 <title>SBA Lenders — 7(a) &amp; 504 originators (CA · LA breakout)</title>
 <link rel="stylesheet" href="/lending-grid.css">
   <link rel="stylesheet" href="/nav-agent/nav-agent.css"><!-- nav-agent -->
+  <link rel="stylesheet" href="/crcp-theme.css"><!-- CRCP day/night tokens: load LAST so html[data-theme] wins -->
 </head>
 <body>
 <header>
@@ -78,5 +80,6 @@ window.GRID_CONFIG = {
 <script src="/col-resize.js" defer></script>
 <script src="/corner-nav.js" defer></script>
   <script src="/nav-agent/nav-agent.js" defer></script><!-- nav-agent -->
+  <script src="/crcp-theme.js" defer></script><!-- CRCP day/night toggle (auto-injects into header) -->
 </body>
 </html>
diff --git a/scripts/apply-crcp-theme.js b/scripts/apply-crcp-theme.js
new file mode 100644
index 0000000..72286b1
--- /dev/null
+++ b/scripts/apply-crcp-theme.js
@@ -0,0 +1,29 @@
+#!/usr/bin/env node
+// TK-10703 Phase 2: idempotently add the canonical CRCP day/night theme to the theme-less pages.
+// ADDITIVE ONLY — inserts 3 things and touches nothing else:
+//   1) a pre-paint head boot that applies the saved theme (key 'crcp-theme', default dark)
+//   2) <link href="/crcp-theme.css"> right before </head> (loads LAST so its html[data-theme] tokens win)
+//   3) <script src="/crcp-theme.js" defer> before </body> (auto-injects the ☀️/🌙 toggle into the header)
+// Skips any page already carrying crcp-theme.js (so the 5 already-themed pages are untouched).
+const fs = require('fs'), path = require('path');
+const PUB = path.join(__dirname, '..', 'public');
+const PAGES = process.argv.slice(2);
+const BOOT = `<script>(function(){try{var t=localStorage.getItem('crcp-theme');document.documentElement.setAttribute('data-theme',t==='light'?'light':'dark');}catch(e){document.documentElement.setAttribute('data-theme','dark');}})();</script>`;
+const CSS  = `  <link rel="stylesheet" href="/crcp-theme.css"><!-- CRCP day/night tokens: load LAST so html[data-theme] wins -->`;
+const JS   = `  <script src="/crcp-theme.js" defer></script><!-- CRCP day/night toggle (auto-injects into header) -->`;
+let done = 0, skip = 0, miss = 0;
+for (const name of PAGES) {
+  const p = path.join(PUB, name + '.html');
+  if (!fs.existsSync(p)) { console.log(`MISS  ${name}`); miss++; continue; }
+  let h = fs.readFileSync(p, 'utf8');
+  if (h.includes('crcp-theme.js')) { console.log(`SKIP  ${name} (already themed)`); skip++; continue; }
+  const before = h;
+  if (h.includes('<head>')) h = h.replace('<head>', '<head>\n' + BOOT);
+  else { console.log(`MISS  ${name} (no <head>)`); miss++; continue; }
+  if (!h.includes('crcp-theme.css')) h = h.replace('</head>', CSS + '\n</head>');
+  h = h.replace('</body>', JS + '\n</body>');
+  if (h === before) { console.log(`SKIP  ${name} (no anchors changed)`); skip++; continue; }
+  fs.writeFileSync(p, h);
+  console.log(`THEME ${name}`); done++;
+}
+console.log(`\n-- themed:${done} skipped:${skip} missing:${miss} --`);

← 8cdf838 just-listed: Cody-gate fixes — recency join by address (new-  ·  back to Commercialrealestate  ·  CRCP theme Cody-gate fixes: lending-grid.css + deals-flow + fcfd72b →