← back to Commercialrealestate
public/sba-lenders.html
86 lines
<!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>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Crect width='16' height='16' rx='3' fill='%230c0f15'/%3E%3Ctext x='8' y='12' font-size='9' text-anchor='middle' fill='%23C8A24B'%3E%F0%9F%92%BC%3C/text%3E%3C/svg%3E">
<title>SBA Lenders — 7(a) & 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>
<h1><b>💼 SBA Lenders</b> — 7(a) & 504</h1>
<div class="nav"><a href="/lending.html">← Lending</a><a href="/lenders.html">🏦 Banks</a><a href="/mortgage-market.html">📊 Market</a></div>
<span class="spacer"></span>
<input class="search" id="q" type="text" placeholder="search all fields — lender, program, fiscal years, source… (space = AND)">
<div class="toggle" id="view"><button data-v="table" class="on">▦ List</button><button data-v="grid">▤ Grid</button></div>
<select id="sortsel" title="Sort"></select>
<label id="denswrap" title="Card density — grid view">⤢<input type="range" id="density" min="1" max="10" step="1"></label>
<button class="csvbtn" id="csv" title="Export current rows to CSV">⬇ CSV</button>
<span class="count" id="count">…</span>
</header>
<div class="shell">
<aside class="rail">
<div id="railFacets"></div>
<div class="rsec"><h4>Fields / columns — show / hide</h4>
<div class="fieldtoggles" id="fFields"></div>
<div style="margin-top:8px"><button class="minibtn" id="fAll">All</button><button class="minibtn" id="fNone">None</button><button class="minibtn" id="fReset" title="Reset columns to the tight default">↺ Reset</button></div>
<div class="mut" style="font-size:10.5px;margin-top:7px;line-height:1.35">Drag a column header to reorder · drag its right edge to resize · click to sort.</div>
</div>
</aside>
<div class="wrap">
<div class="databar"><span class="pubtag">Public data</span><span id="demoNote">U.S. SBA — 7(a) & 504 FOIA data by lender (CA, LA-County breakout). <b style="color:var(--warn)">Unequal windows:</b> 504 = FY2010–present (~16y), 7(a) = FY2020–present (~6y). Totals are NOT time-normalized — filter by Program before ranking.</span></div>
<div id="tableView" class="tblwrap"><table class="g" data-no-sort><thead id="thead"></thead><tbody id="tbody"></tbody></table></div>
<div id="gridView" class="grid hide"></div>
</div>
</div>
<div id="ov"><div id="modal"><button class="x" aria-label="Close" onclick="document.getElementById('ov').classList.remove('on')">✕</button><div id="mbody"></div></div></div>
<script>
window.GRID_CONFIG = {
ns: 'crcpSBA', noun: 'SBA lenders', nameKey: 'lender', idKey: 'id',
title: 'SBA 7(a)/504 lender · CA volume',
api: '/api/lending/sba-lenders', dataKey: 'lenders',
sortKey: 'total_approved', sortDir: -1,
defaultCols: ['lender', 'program', 'loan_count', 'total_approved', 'avg_loan', 'fiscal_years', 'source'],
badgeClass: (k, v) => k === 'program' ? (/504/.test(v) ? 'warn' : 'com') : 'com',
cols: [
// Identity
{ k: 'lender', l: 'Lender', t: 's', g: 'Identity', max: 46 },
{ k: 'program', l: 'Program', t: 'badge', g: 'Identity' },
// CA volume
{ k: 'loan_count', l: 'CA loans', t: 'n', g: 'CA volume' },
{ k: 'total_approved', l: 'CA approved', t: 'money', g: 'CA volume' },
{ k: 'avg_loan', l: 'Avg loan', t: 'money', g: 'CA volume' },
// LA-County breakout
{ k: 'la_loan_count', l: 'LA loans', t: 'n', g: 'LA County' },
{ k: 'la_approved', l: 'LA approved', t: 'money', g: 'LA County', def: 0 },
// Coverage
{ k: 'fiscal_years', l: 'Fiscal years', t: 's', g: 'Coverage' },
{ k: 'fy_min', l: 'First FY', t: 'n', g: 'Coverage', def: 0 },
{ k: 'fy_max', l: 'Last FY', t: 'n', g: 'Coverage', def: 0 },
// Provenance
{ k: 'source', l: 'Source', t: 'src', g: 'Evidence' },
{ k: 'retrieved_at', l: 'Retrieved', t: 'date', g: 'Evidence', def: 0 },
],
facets: [
{ k: 'program', l: 'Program', limit: 4 },
{ k: 'ca_size', l: 'CA volume', derive: r => r.total_approved >= 1e9 ? '$1B+' : r.total_approved >= 1e8 ? '$100M–$1B' : r.total_approved >= 1e7 ? '$10M–$100M' : r.total_approved >= 1e6 ? '$1M–$10M' : 'under $1M', limit: 6 },
{ k: 'la_presence', l: 'LA County', derive: r => r.la_loan_count > 0 ? 'has LA loans' : 'no LA loans', limit: 3 },
],
};
</script>
<script src="/column-manager.js" defer></script>
<script src="/lending-grid.js" defer></script>
<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>