← back to Prestige Car Wash
admin: Low Hanging Fruit ranked panel (ROI÷time over /api/admin/suggestions, quick-wins flagged)
e8481b2620c4aef7ce50ec323ffbd297cc0bc973 · 2026-07-26 07:25:21 -0700 · Steve Abrams
Files touched
M public/admin/index.html
Diff
commit e8481b2620c4aef7ce50ec323ffbd297cc0bc973
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Sun Jul 26 07:25:21 2026 -0700
admin: Low Hanging Fruit ranked panel (ROI÷time over /api/admin/suggestions, quick-wins flagged)
---
public/admin/index.html | 55 +++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 55 insertions(+)
diff --git a/public/admin/index.html b/public/admin/index.html
index 6b3096a..fdb4e7f 100644
--- a/public/admin/index.html
+++ b/public/admin/index.html
@@ -61,6 +61,61 @@
<div class="links" style="margin-left:auto"><a href="/" target="_blank">View site ↗</a></div>
</div></nav>
+<!-- Low Hanging Fruit — reusable ranked read-only view over /api/admin/suggestions.
+ ROI = impact/effort; time from effort; quick wins (low effort + high impact) flagged. -->
+<section id="lhf">
+ <style>
+ #lhf{margin:20px 24px 4px;background:#1c1915;border:1px solid #2c2823;border-radius:6px;padding:18px 20px}
+ #lhf .lhf-h{display:flex;justify-content:space-between;align-items:baseline;gap:12px;flex-wrap:wrap;margin-bottom:2px}
+ #lhf .lhf-h h2{font-size:13px;letter-spacing:.14em;text-transform:uppercase;color:#c6a765;margin:0}
+ #lhf .lhf-sub{color:#8a8272;font-size:12px}
+ #lhf ol{list-style:none;margin:14px 0 0;padding:0;display:grid;gap:10px}
+ #lhf li{display:grid;grid-template-columns:34px 1fr;gap:12px;background:#161310;border:1px solid #2c2823;border-radius:5px;padding:12px 14px}
+ #lhf li.fruit{border-color:#c6a765}
+ #lhf .rk{font-size:20px;font-weight:800;color:#c6a765;line-height:1.1}
+ #lhf .ti{font-weight:600;color:#e9e2d6}
+ #lhf .badges{display:flex;flex-wrap:wrap;gap:6px;margin:6px 0}
+ #lhf .b{font-size:10px;letter-spacing:.05em;text-transform:uppercase;padding:3px 8px;border-radius:3px;border:1px solid #2c2823;color:#b8ad97}
+ #lhf .b.roi-high,#lhf .b.time-quick{color:#7ad17a;border-color:#3a5a3a}
+ #lhf .b.roi-solid{color:#c6a765}
+ #lhf .b.fruit{background:#c6a765;color:#12100e;border:0;font-weight:700}
+ #lhf .rat{font-size:12.5px;color:#b8ad97;margin-top:2px}
+ #lhf .why{font-size:12.5px;color:#8a8272;margin-top:4px}
+ #lhf .why b{color:#c6a765;font-weight:600}
+ #lhf .empty{color:#8a8272;font-size:13px}
+ </style>
+ <div class="lhf-h">
+ <h2>⚡ Low Hanging Fruit</h2>
+ <span class="lhf-sub">ranked by ROI ÷ time — fastest, highest-return moves first</span>
+ </div>
+ <ol id="lhf-list"><li class="empty">Loading growth moves…</li></ol>
+ <script>
+ (function(){
+ var TIME=function(e){return e<=2?['Quick','time-quick']:e===3?['Moderate','time-mod']:['Involved','time-inv'];};
+ var ROI=function(i,e){var r=i/Math.max(1,e);return r>=2?['High','roi-high']:r>=1.2?['Solid','roi-solid']:['Low','roi-low'];};
+ function esc(s){return String(s==null?'':s).replace(/[&<>"]/g,function(c){return {'&':'&','<':'<','>':'>','"':'"'}[c];});}
+ fetch('/api/admin/suggestions').then(function(r){return r.ok?r.json():[];}).then(function(list){
+ var el=document.getElementById('lhf-list');
+ list=(list||[]).filter(function(s){return s&&s.title;});
+ if(!list.length){el.innerHTML='<li class="empty">No growth moves yet — add ideas in the Growth Moves panel below.</li>';return;}
+ list.forEach(function(s){s._i=Number(s.impact)||0;s._e=Number(s.effort)||3;s._roi=s._i/Math.max(1,s._e);s._fruit=s._e<=2&&s._i>=4;});
+ list.sort(function(a,b){return b._roi-a._roi||a._e-b._e||b._i-a._i;});
+ el.innerHTML=list.map(function(s,idx){
+ var t=TIME(s._e),ro=ROI(s._i,s._e);
+ var why=s._fruit?`<div class="why"><b>Why it’s simple:</b> leverages an asset you already have (effort ${s._e}/5) for outsized return (impact ${s._i}/5) — activate, don’t rebuild.</div>`:'';
+ return `<li class="${s._fruit?'fruit':''}"><div class="rk">${idx+1}</div><div>`+
+ `<div class="ti">${esc(s.title)}</div>`+
+ `<div class="badges">${s._fruit?'<span class="b fruit">⚡ Quick win</span>':''}`+
+ `<span class="b ${ro[1]}">ROI ${ro[0]}</span><span class="b ${t[1]}">⏱ ${t[0]}</span>`+
+ `${s.category?`<span class="b">${esc(s.category)}</span>`:''}`+
+ `<span class="b">impact ${s._i} / effort ${s._e}</span></div>`+
+ `${s.rationale?`<div class="rat">${esc(s.rationale)}</div>`:''}${why}</div></li>`;
+ }).join('');
+ }).catch(function(){document.getElementById('lhf-list').innerHTML='<li class="empty">Could not load suggestions.</li>';});
+ })();
+ </script>
+</section>
+
<div class="wrap">
<div class="tabs" id="tabs"></div>
← e283f28 Prestige supercharger idea: pivot to owned route + payback m
·
back to Prestige Car Wash
·
lhf: contrarian fixes — panel note replaces per-card filler, 78ccc70 →