← back to Commercialrealestate
CRCP: migrate last 4 pages (index/mls/fha-loans/graphics) off stale crcp-theme2 key -> crcp-theme, so day/night choice syncs fleet-wide
50e13d6fc0447d68e6f30c83d9cfa579052afa30 · 2026-08-19 08:26:27 -0700 · Steve Abrams
Files touched
M public/fha-loans.htmlM public/graphics.htmlM public/index.htmlM public/mls.html
Diff
commit 50e13d6fc0447d68e6f30c83d9cfa579052afa30
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Wed Aug 19 08:26:27 2026 -0700
CRCP: migrate last 4 pages (index/mls/fha-loans/graphics) off stale crcp-theme2 key -> crcp-theme, so day/night choice syncs fleet-wide
---
public/fha-loans.html | 8 ++++----
public/graphics.html | 8 ++++----
public/index.html | 6 +++---
public/mls.html | 12 ++++++------
4 files changed, 17 insertions(+), 17 deletions(-)
diff --git a/public/fha-loans.html b/public/fha-loans.html
index d58a3d9..dde3bdc 100644
--- a/public/fha-loans.html
+++ b/public/fha-loans.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>
@@ -557,17 +557,17 @@ load();
(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/graphics.html b/public/graphics.html
index 3469a7a..fbcbc15 100644
--- a/public/graphics.html
+++ b/public/graphics.html
@@ -1,7 +1,7 @@
<!doctype html>
<html lang="en">
<head>
-<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>
@@ -111,17 +111,17 @@
(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/index.html b/public/index.html
index c053fee..988daa6 100644
--- a/public/index.html
+++ b/public/index.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>
@@ -2254,7 +2254,7 @@ function loadRanked(_retry){ return fetch('data/ranked.json').then(r=>{ if(!r.ok
<script src="/corner-nav.js" defer></script>
<script>
// Day/Night toggle — theme already applied before first paint by the head snippet.
-// crcp-theme2 key; Day (light) is the default. Only an explicit click persists.
+// crcp-theme key; Day (light) is the default. Only an explicit click persists.
(function(){
var root=document.documentElement;
function label(t){
@@ -2270,7 +2270,7 @@ function loadRanked(_retry){ return fetch('data/ranked.json').then(r=>{ if(!r.ok
btn.addEventListener('click',function(){
var nt=root.getAttribute('data-theme')==='light'?'dark':'light';
applyTheme(nt);
- try{ localStorage.setItem('crcp-theme2',nt); }catch(e){}
+ try{ localStorage.setItem('crcp-theme',nt); }catch(e){}
});
var host=document.querySelector('header .nav')||document.querySelector('header');
if(host){ host.appendChild(btn); } else { btn.style.cssText+=';position:fixed;top:12px;right:14px;z-index:99999'; document.body.appendChild(btn); }
diff --git a/public/mls.html b/public/mls.html
index 0f95899..85cc30a 100644
--- a/public/mls.html
+++ b/public/mls.html
@@ -10,7 +10,7 @@
Same-origin so the Basic-auth session cookie (set on this navigation) authenticates it. Must run
before any fetch(). Also tidy the visible address bar. -->
<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: the Nav Agent grid controls can persist a "removed"/"collapsed" state that hides the
WHOLE records grid with no obvious way back (this is how the listings went blank). The main data
grid should never stay removed/collapsed across loads, so clear that state before nav-agent runs. -->
@@ -237,17 +237,17 @@
(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();
@@ -416,7 +416,7 @@ function rehydrateView(){
try{ const a=JSON.parse(localStorage.getItem('mlsColOrder')||'[]'); COLORDER=Array.isArray(a)?a:[]; }catch(e){ COLORDER=[]; }
const sk=localStorage.getItem('mlsSortKey'); if(sk) sortKey=sk;
const sd=localStorage.getItem('mlsSortDir'); if(sd!==null&&sd!=='') sortDir=(+sd<0?-1:1);
- const th=localStorage.getItem('crcp-theme2'); if(th) document.documentElement.setAttribute('data-theme', th==='dark'?'dark':'light');
+ const th=localStorage.getItem('crcp-theme'); if(th) document.documentElement.setAttribute('data-theme', th==='dark'?'dark':'light');
lastColSig=''; // force column widths/resize-handles to re-init
try{ hydrateFilters(); }catch(e){} // TK-10687: apply the profile-synced saved filters too
try{ buildRail(); }catch(e){} // keep the left rail's field-toggles in sync with the restored columns
@@ -743,7 +743,7 @@ if($('#csv2')) $('#csv2').addEventListener('click',exportCSV);
// existing CRCP accounts system (scrypt-hashed passwords, session cookie). ──
(function(){
const bar=$('#acctbar'); if(!bar) return;
- const SKEYS=/^mls|^cre_mls|^crcp-theme2$/; // the localStorage keys that make up a user's view
+ const SKEYS=/^mls|^cre_mls|^crcp-theme$/; // the localStorage keys that make up a user's view
const collect=()=>{ const o={}; for(let i=0;i<localStorage.length;i++){ const k=localStorage.key(i); if(SKEYS.test(k)) o[k]=localStorage.getItem(k); } return o; };
const applyLocal=o=>{ Object.keys(o||{}).forEach(k=>{ try{localStorage.setItem(k,o[k]);}catch(e){} }); };
const fmt=ts=>{ if(!ts) return 'never'; try{ return new Date(ts).toLocaleString(undefined,{month:'short',day:'numeric',hour:'numeric',minute:'2-digit'}); }catch(e){ return '—'; } };
← 92d0cec CRCP firms: new /api/firms directory endpoint (firm rosters:
·
back to Commercialrealestate
·
rent-rolls: convert bare dark-surface literals to themed var a206405 →