diff --git a/server/api_test.go b/server/api_test.go index 9ddcfcd..4923f23 100644 --- a/server/api_test.go +++ b/server/api_test.go @@ -447,8 +447,10 @@ func TestUIScoredFalseSuppressesVerdicts(t *testing.T) { t.Error("loss curve is not gated on d.scored; it would render when unscored") } - // The table function must accept a scored parameter. - if !strings.Contains(page, "function table(rungs, scored)") { + // The table function must accept a scored parameter and the corridor's + // dependencies (so an unpriced DERIVATIVE rung can name what it routes + // through without overflowing the row). + if !strings.Contains(page, "function table(rungs, scored, depends)") { t.Error("table() does not accept a scored parameter") } diff --git a/server/index.html b/server/index.html index 7ebb14c..c831327 100644 --- a/server/index.html +++ b/server/index.html @@ -63,14 +63,26 @@ background: var(--panel); border: 1px solid var(--border); border-radius: 10px; padding: 1.15rem 1.25rem; margin-bottom: 1.25rem; } + .integrity-card { display: grid; grid-template-columns: auto 1fr; gap: .75rem 1rem; align-items: start; margin-bottom: .35rem; } .badge { - display: inline-block; font: 600 .72rem/1 var(--mono); letter-spacing: .06em; - padding: .4rem .6rem; border-radius: 5px; border: 1px solid currentColor; - text-transform: uppercase; + display: inline-flex; align-items: center; gap: .45rem; width: fit-content; + font: 700 .78rem/1 var(--mono); letter-spacing: .06em; + padding: .55rem .7rem; border-radius: 7px; border: 2px solid currentColor; + text-transform: uppercase; white-space: nowrap; } - .b-direct { color: var(--muted); } - .b-derivative { color: var(--warn); } - .b-nomarket { color: var(--bad); } + .badge::before { font-size: 1rem; line-height: 1; } + .b-direct { color: var(--ok); background: var(--ok-soft); } + .b-direct::before { content: "◆"; } + .b-derivative { color: var(--warn); background: color-mix(in srgb, var(--warn) 12%, var(--panel)); } + .b-derivative::before { content: "↪"; } + .b-nomarket { color: var(--bad); background: var(--bad-soft); } + .b-nomarket::before { content: "∅"; } + .integrity-copy { min-width: 0; } + .integrity-title { font-weight: 700; margin: 0; } + .integrity-help { color: var(--muted); font-size: .88rem; margin: .15rem 0 0; } + .integrity-dependency { font-family: var(--mono); font-size: .8rem; margin: .35rem 0 0; color: var(--warn); } + .integrity-card .badge[title] { cursor: help; } + @media (max-width: 520px) { .integrity-card { grid-template-columns: 1fr; gap: .45rem; } } .finding { font-size: 1.02rem; margin: .85rem 0 0; } .rec-none { margin-top: .9rem; padding: .7rem .85rem; border-radius: 6px; @@ -136,6 +148,10 @@ .legend-item { display: flex; align-items: center; gap: .45rem; min-width: 0; } .legend-item span:last-child { font-size: .8rem; } .case { font-size: .88rem; color: var(--muted); } + .integrity-cell { white-space: nowrap; } + .integrity-cell .badge { font-size: .65rem; padding: .3rem .45rem; border-width: 1px; } + .integrity-cell .badge::before { font-size: .8rem; } + .integrity-cell .integrity-via { font-family: var(--mono); font-size: .72rem; color: var(--warn); margin-left: .35rem; } .case strong { color: var(--ink); font-weight: 600; } svg { width: 100%; height: auto; display: block; } .axis { fill: var(--muted); font: 10px var(--mono); } @@ -234,6 +250,50 @@
${esc(info.dependency)}
` : ''; + return `${esc(info.title)}
${esc(info.help)}
${dependency}${esc(d.finding)}
${d.scored ? recommendationBlock(d) : unscoredBlock(d)}