← back to Rentv Sheet Enrich Refine
rentv :9797 exact-colors: Cody fixes — readable text on painted link/mail/phone cells, saved-flash survives, drop ghost near-whites
707c9b10a6b708293b7574dd96f52433ee38df0f · 2026-08-13 18:12:06 -0700 · Steve Abrams
- link/mail/phone cells now get bg+auto-contrast text via --xtext var + td.xcol CSS
(!important) so accent-blue link text isn't unreadable on magenta/cyan fills
- td.saved flash forced !important so a write-confirm still shows on colored cells
- hexc() skips near-white greyscale ghosts (#f3f3f3 etc, invisible on panels); keeps #e6e6e6+
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Files touched
M public_live/index.htmlM snapshot.py
Diff
commit 707c9b10a6b708293b7574dd96f52433ee38df0f
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Thu Aug 13 18:12:06 2026 -0700
rentv :9797 exact-colors: Cody fixes — readable text on painted link/mail/phone cells, saved-flash survives, drop ghost near-whites
- link/mail/phone cells now get bg+auto-contrast text via --xtext var + td.xcol CSS
(!important) so accent-blue link text isn't unreadable on magenta/cyan fills
- td.saved flash forced !important so a write-confirm still shows on colored cells
- hexc() skips near-white greyscale ghosts (#f3f3f3 etc, invisible on panels); keeps #e6e6e6+
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---
public_live/index.html | 13 +++++++------
snapshot.py | 2 ++
2 files changed, 9 insertions(+), 6 deletions(-)
diff --git a/public_live/index.html b/public_live/index.html
index a69d9b4..e8f8e34 100644
--- a/public_live/index.html
+++ b/public_live/index.html
@@ -87,7 +87,8 @@
/* EXPAND ON CLICK: focus a cell (e.g. Notes) and it wraps + grows to show/edit the whole value */
td[contenteditable]:focus{outline:none;background:var(--cellfocus);box-shadow:inset 0 0 0 2px var(--accent);
white-space:pre-wrap;word-break:break-word;overflow:visible;text-overflow:clip;min-width:260px;max-width:520px;position:relative;z-index:4}
- td.saved{background:var(--green);color:var(--greenink)}
+ td.saved{background:var(--green)!important;color:var(--greenink)!important}
+ td.xcol .linkval,td.xcol .cicon{color:var(--xtext)!important} /* exact-color cell: keep link/icon text readable on the painted bg */
td.enriched{box-shadow:inset 3px 0 0 #7bc043;background:rgba(123,192,67,.09)}
td a{color:var(--accent);text-decoration:none} .namecell{font-weight:600}
a.iconbtn,a.callbtn{display:inline-flex;align-items:center;justify-content:center;margin-left:5px;text-decoration:none;cursor:pointer;opacity:.72;vertical-align:middle}
@@ -559,8 +560,8 @@ function closeStatusPickerOutside(e){ if(!e.target.closest('#statusmenu')&&!e.ta
function cellTD(ri,ci,val,isN,gr){
const cls=[isN?'namecell':'',gr?'enriched':''].filter(Boolean).join(' ');
const s=String(val==null?'':val);
- const xc=COLORS[ri+','+ci]; // EXACT original sheet cell color, if any -> paint it back in
- const xbg=xc?` style="background:${xc}"`:'', xsty=xc?` style="background:${xc};color:${txtOn(xc)}"`:'';
+ const xc=COLORS[ri+','+ci], xt=xc?txtOn(xc):''; // EXACT original sheet cell color + auto-contrast text
+ const xsty=xc?` style="background:${xc};color:${xt};--xtext:${xt}"`:'', xcls=xc?' xcol':'';
if(isStatusCol(ci)){ // color-coded status chip + date/time under it + click-to-set picker
const lm=lmCol(), dt=(lm>=0 && DATA.rows[ri] && DATA.rows[ri][lm])||'';
const dtHtml=dt?`<div class="chipdate" title="Last modified">🕓 ${esc(String(dt))}</div>`:'';
@@ -569,12 +570,12 @@ function cellTD(ri,ci,val,isN,gr){
return `<td data-r="${ri}" data-c="${ci}" contenteditable="false" class="statuscell ${cls}" title="Click to change status"><span class="statuschip" style="background:${col};color:${txtOn(col)}">${esc(s)}</span>${dtHtml}</td>`;
}
const em=emailOf(s);
- if(em){ return `<td data-r="${ri}" data-c="${ci}" contenteditable="false" data-mail="${esc(em)}" title="Email ${esc(em)}" class="mailcell ${cls}"${xbg}><span class="cicon">${ICON.mail}</span><span class="linkval">${esc(em)}</span></td>`; }
+ if(em){ return `<td data-r="${ri}" data-c="${ci}" contenteditable="false" data-mail="${esc(em)}" title="Email ${esc(em)}" class="mailcell ${cls}${xcls}"${xsty}><span class="cicon">${ICON.mail}</span><span class="linkval">${esc(em)}</span></td>`; }
const u=hrefOf(s);
if(u){ const li=/linkedin\.com/i.test(u), disp=s.replace(/^https?:\/\/(www\.)?/i,'').replace(/\/+$/,'');
- return `<td data-r="${ri}" data-c="${ci}" contenteditable="false" data-href="${esc(u)}" title="Open ${esc(u)}" class="linkcell ${li?'li':'web'} ${cls}"${xbg}><span class="cicon">${li?ICON.li:ICON.web}</span><span class="linkval">${esc(disp)}</span></td>`; }
+ return `<td data-r="${ri}" data-c="${ci}" contenteditable="false" data-href="${esc(u)}" title="Open ${esc(u)}" class="linkcell ${li?'li':'web'} ${cls}${xcls}"${xsty}><span class="cicon">${li?ICON.li:ICON.web}</span><span class="linkval">${esc(disp)}</span></td>`; }
const d=telDigits(s);
- if(d){ return `<td data-r="${ri}" data-c="${ci}" contenteditable="false" data-tel="+${d}" title="Call ${esc(s)}" class="callcell ${cls}"${xbg}><span class="cicon">${ICON.phone}</span><span class="linkval">${esc(s)}</span></td>`; }
+ if(d){ return `<td data-r="${ri}" data-c="${ci}" contenteditable="false" data-tel="+${d}" title="Call ${esc(s)}" class="callcell ${cls}${xcls}"${xsty}><span class="cicon">${ICON.phone}</span><span class="linkval">${esc(s)}</span></td>`; }
return `<td data-r="${ri}" data-c="${ci}" contenteditable="true" title="${esc(s)}" class="${cls}"${xsty}>${esc(s)}</td>`;
}
function cellRender(v){v=String(v==null?'':v);const u=hrefOf(v);
diff --git a/snapshot.py b/snapshot.py
index 8d16f87..76e1f2f 100644
--- a/snapshot.py
+++ b/snapshot.py
@@ -43,6 +43,8 @@ def build(tok=None):
r, g, b = bg.get("red", 0.0), bg.get("green", 0.0), bg.get("blue", 0.0)
if r > 0.96 and g > 0.96 and b > 0.96: # white / default = not a color code
return None
+ if (max(r, g, b) - min(r, g, b)) < 0.04 and min(r, g, b) > 0.91: # near-white greyscale ghost (invisible on panels); keeps #e6e6e6 & darker greys
+ return None
return "#%02x%02x%02x" % (round(r * 255), round(g * 255), round(b * 255))
fmt = api(f"{lib.API}/{lib.SID}?{qs}&includeGridData=true"
"&fields=sheets(properties(sheetId),data.rowData.values.effectiveFormat.backgroundColor)", tok)
← 1c5e092 FIX write off-by-hr: 9 tabs have a title row above the heade
·
back to Rentv Sheet Enrich Refine
·
auto-data-snapshot: 2026-08-13T18:37:41 (1 data files) — __p 60e8dcd →