T1.5 - F5 (interim): wizard fields stop looking disabled

INTERIM. T3.4 removes the duplicate token underneath this; the job here is only
the appearance, and no token consolidation is started.

The wizard filled its inputs with var(--bg) - which in this sheet is the PAGE
BACKGROUND, #f4f4f4 - on a #e0e0e0 border. An empty required field was
indistinguishable from a locked one, which is why people were not typing in
them. The cause is the one the review named: this sheet redeclares its own
tokens, so it never saw --cds-field: #ffffff, even though theme-light.css has
been supplying that to this page all along.

Fields now consume --cds-field, and take the same --border-strong the creator's
inputs already use, so a field looks like a field on both pages. No new value is
introduced - both tokens already existed.

That inverts a signal if left there, so it needed the other half: there was no
disabled rule at all on this page, meaning locked fields would have turned white
too. Disabled and readonly fields now take --cds-field-02, the theme's own
secondary field surface, matching .locked-field in the creator. Enabled #ffffff
against disabled #f4f4f4, verified by computed style rather than by eye.

The border is deliberately the same on both states. I first wrote
`border-color: var(--border)` on the disabled rule and could not demonstrate it
taking effect - the rule matches, is more specific than the base rule, and its
background applies, but the computed border stayed --border-strong. Rather than
ship a declaration whose effect I cannot show, it is gone: a consistent border
is what "consistent with inputs elsewhere" asks for, and the fill is what
carries the state.

Screenshot diff is limited to the wizard, but establishing that took a control
run. admin and users appeared to change too, until capturing twice with NO code
change showed they differ from themselves - the console pages render live
timestamps and are not byte-stable. login, launcher, sop, creator and field are.
Recorded in the baseline README so the next task with a "no layout change"
done-when does not chase it.

The F5 probe now also fails if enabled and disabled fields become identical,
which is the way this fix could silently go wrong.

f_items: F1-F5 FIXED, F6 untouched as wave 1 requires. browser_check 71/71.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-14 18:48:47 -05:00
parent 4d3258113a
commit 5f3141e2a3
3 changed files with 61 additions and 9 deletions

View File

@@ -379,16 +379,23 @@ def f5(page, base, tok):
wait_for="!!document.querySelector('.field input, .field select')")
time.sleep(0.9)
got = page.eval("""(function(){
var out=[], n=0;
var out=[], n=0, dis=[];
document.querySelectorAll('.field input,.field select,.field textarea').forEach(function(e){
if(e.disabled||e.readOnly||e.type==='hidden'||e.type==='checkbox'||e.type==='radio') return;
if(e.type==='hidden'||e.type==='checkbox'||e.type==='radio') return;
var r=e.getBoundingClientRect(); if(r.width===0&&r.height===0) return;
n++;
var s=getComputedStyle(e);
out.push(s.backgroundColor+' | '+s.borderTopColor);
var s=getComputedStyle(e), sig=s.backgroundColor+' | '+s.borderTopColor;
if(e.disabled||e.readOnly){ dis.push(sig); return; }
n++; out.push(sig);
});
var tally={}; out.forEach(function(v){tally[v]=(tally[v]||0)+1;});
return JSON.stringify({n:n,tally:tally});})()""")
var dtally={}; dis.forEach(function(v){dtally[v]=(dtally[v]||0)+1;});
// Prove the disabled rule works even when the page has no disabled field to
// sample: borrow a real one, flip it, measure, put it back.
var probe=document.querySelector('.field input:not([type=hidden])'), forced=null;
if(probe){ var was=probe.disabled; probe.disabled=true;
var ps=getComputedStyle(probe);
forced=ps.backgroundColor+' | '+ps.borderTopColor; probe.disabled=was; }
return JSON.stringify({n:n,tally:tally,dis:dtally,forced:forced});})()""")
m = json.loads(got)
if not m["n"]:
return report("F5", UNKNOWN, "no enabled wizard inputs found")
@@ -398,7 +405,15 @@ def f5(page, base, tok):
if greyed:
return report("F5", REPRO,
f"{greyed}/{m['n']} enabled inputs fill #f4f4f4 (most common: {top[0]})")
return report("F5", FIXED, f"{m['n']} enabled inputs, none grey-filled (most common: {top[0]})")
# An enabled field that looks exactly like a disabled one is the same defect
# inverted, so this must not silently pass.
if m["forced"] and m["forced"] == top[0]:
return report("F5", REPRO,
f"enabled and disabled fields are identical ({top[0]}) - "
f"locked fields no longer read as locked")
extra = f", disabled reads {m['forced']}" if m["forced"] else ""
return report("F5", FIXED,
f"{m['n']} enabled inputs at {top[0]}{extra}")
# ── F6 ────────────────────────────────────────────────────────────────────────