the-return-path / src /styles.css
Beta
feat: publish Return Path benchmark view
15fee2d
Raw History Blame Contribute Delete
31.6 kB
/*
* The Return Path — Cage & Key
* A self-contained visual system for an editorial feedback laboratory.
*/
@layer reset, tokens, base, layout, components, states, accessibility;
@layer reset {
*,
*::before,
*::after {
box-sizing: border-box;
}
html {
color-scheme: dark;
font-synthesis: none;
text-size-adjust: 100%;
}
body,
h1,
h2,
h3,
p,
ol,
ul,
dl,
dd,
figure,
blockquote {
margin: 0;
}
ol,
ul {
padding: 0;
}
button,
input,
select,
textarea {
color: inherit;
font: inherit;
}
button,
label,
select,
input[type="range"] {
-webkit-tap-highlight-color: transparent;
}
img,
svg {
display: block;
max-width: 100%;
}
}
@layer tokens {
:root {
--ink-0: #070908;
--ink-1: #0c0f0d;
--ink-2: #111512;
--ink-3: #171c18;
--ink-4: #202620;
--line: #303830;
--line-soft: rgb(210 220 198 / 12%);
--paper: #f1f1e7;
--paper-soft: #c9ccbd;
--paper-muted: #92998b;
--key: #c8ff62;
--key-soft: #a0ca55;
--key-fade: rgb(200 255 98 / 12%);
--cage: #ff785a;
--cage-soft: #d65f49;
--cage-fade: rgb(255 120 90 / 12%);
--signal: #78bfff;
--signal-soft: #6399c8;
--signal-fade: rgb(120 191 255 / 12%);
--gold: #e4bb66;
--shadow: 0 24px 80px rgb(0 0 0 / 34%);
--shadow-soft: 0 12px 32px rgb(0 0 0 / 22%);
--sans: Inter, ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
--serif: Iowan Old Style, Baskerville, "Times New Roman", Times, serif;
--mono: "SFMono-Regular", Consolas, "Liberation Mono", monospace;
--radius-xs: 0.3rem;
--radius-sm: 0.55rem;
--radius-md: 0.85rem;
--radius-lg: 1.2rem;
--content: 90rem;
--gutter: clamp(1rem, 3vw, 3rem);
--ease-out: cubic-bezier(0.16, 1, 0.3, 1);
}
}
@layer base {
html {
min-width: 20rem;
min-height: 100%;
background: var(--ink-0);
scroll-behavior: smooth;
}
body {
min-width: 20rem;
min-height: 100vh;
color: var(--paper);
background:
radial-gradient(circle at 78% -10%, rgb(200 255 98 / 8%), transparent 31rem),
radial-gradient(circle at -10% 28%, rgb(120 191 255 / 6%), transparent 27rem),
linear-gradient(180deg, var(--ink-1) 0%, var(--ink-0) 72%);
font-family: var(--sans);
font-size: 1rem;
line-height: 1.55;
text-rendering: optimizeLegibility;
}
body::before {
position: fixed;
z-index: -1;
inset: 0;
background-image:
linear-gradient(var(--line-soft) 1px, transparent 1px),
linear-gradient(90deg, var(--line-soft) 1px, transparent 1px);
background-size: 4rem 4rem;
content: "";
mask-image: linear-gradient(to bottom, black, transparent 82%);
pointer-events: none;
}
::selection {
color: var(--ink-0);
background: var(--key);
}
a {
color: var(--key);
text-decoration-color: rgb(200 255 98 / 45%);
text-underline-offset: 0.22em;
}
a:hover {
text-decoration-color: currentColor;
}
button {
border: 0;
}
}
@layer layout {
#root,
#app {
min-height: 100vh;
}
.app-shell {
position: relative;
isolation: isolate;
width: min(100%, var(--content));
min-height: 100vh;
margin-inline: auto;
padding: 1.15rem var(--gutter) 2.5rem;
}
.app-shell::before {
position: absolute;
z-index: -1;
top: 0;
bottom: 0;
left: var(--gutter);
width: 1px;
background: linear-gradient(var(--key), var(--line) 7rem, transparent 88%);
content: "";
opacity: 0.42;
}
.masthead {
display: grid;
grid-template-columns: minmax(0, 1.4fr) minmax(17rem, 0.6fr);
gap: clamp(1.5rem, 5vw, 5rem);
align-items: end;
padding: clamp(3.25rem, 8vw, 7.25rem) 0 clamp(2rem, 4vw, 3.4rem) clamp(0.85rem, 2vw, 1.5rem);
border-bottom: 1px solid var(--line);
}
.masthead-copy {
min-width: 0;
}
.main-grid {
display: grid;
grid-template-columns: repeat(12, minmax(0, 1fr));
gap: clamp(0.8rem, 1.5vw, 1.25rem);
margin-top: clamp(1.2rem, 3vw, 2.2rem);
}
.main-grid > .panel {
grid-column: span 6;
}
.main-grid > .panel--wide,
.main-grid > .span-8 {
grid-column: span 8;
}
.main-grid > .panel--narrow,
.main-grid > .span-4 {
grid-column: span 4;
}
.main-grid > .panel--full,
.main-grid > .span-full {
grid-column: 1 / -1;
}
.control-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 1rem;
}
.candidate-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 0.75rem;
}
.lane-grid {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 0.75rem;
}
.metric-grid {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 0.65rem;
}
}
@layer components {
.eyebrow {
display: flex;
gap: 0.7rem;
align-items: center;
margin-bottom: clamp(1rem, 2vw, 1.75rem);
color: var(--key);
font-family: var(--mono);
font-size: 0.68rem;
font-weight: 700;
letter-spacing: 0.17em;
line-height: 1.3;
text-transform: uppercase;
}
.eyebrow::before {
width: 1.55rem;
height: 1px;
background: currentColor;
content: "";
}
.title {
max-width: 12ch;
color: var(--paper);
font-family: var(--serif);
font-size: clamp(3.15rem, 8vw, 7.4rem);
font-weight: 400;
letter-spacing: -0.058em;
line-height: 0.84;
text-wrap: balance;
}
.title::after {
color: var(--key);
content: ".";
}
.subtitle {
max-width: 36rem;
margin-top: 1.35rem;
color: var(--paper-soft);
font-family: var(--serif);
font-size: clamp(1.1rem, 1.8vw, 1.42rem);
font-style: italic;
line-height: 1.45;
}
.boundary-note {
position: relative;
padding: 2.15rem 1.1rem 1.1rem;
border: 1px solid var(--line);
border-left-color: var(--signal);
border-radius: var(--radius-sm);
color: var(--paper-soft);
background: linear-gradient(135deg, var(--signal-fade), transparent 62%);
font-size: 0.83rem;
line-height: 1.6;
}
.boundary-note::before {
position: absolute;
top: 0.75rem;
left: 1.1rem;
color: var(--signal);
content: "OBSERVATION BOUNDARY";
font-family: var(--mono);
font-size: 0.58rem;
font-weight: 700;
letter-spacing: 0.14em;
}
.boundary-note code {
overflow-wrap: anywhere;
word-break: break-word;
}
.stage-nav {
display: grid;
grid-template-columns: repeat(6, minmax(0, 1fr));
padding: 0.75rem 0;
border-bottom: 1px solid var(--line);
overflow-x: auto;
scrollbar-color: var(--line) transparent;
}
.stage-button {
position: relative;
display: flex;
min-width: 8rem;
min-height: 3.4rem;
gap: 0.7rem;
align-items: center;
justify-content: flex-start;
padding: 0.65rem 0.85rem;
border-right: 1px solid var(--line-soft);
border-radius: var(--radius-xs);
color: var(--paper-muted);
background: transparent;
cursor: pointer;
font-family: var(--mono);
font-size: 0.68rem;
font-weight: 700;
letter-spacing: 0.08em;
line-height: 1.25;
text-align: left;
text-transform: uppercase;
transition:
color 180ms ease,
background-color 180ms ease,
transform 180ms var(--ease-out);
}
.stage-button:last-child {
border-right-color: transparent;
}
.stage-button::before {
display: grid;
flex: 0 0 auto;
width: 1.75rem;
height: 1.75rem;
place-items: center;
border: 1px solid var(--line);
border-radius: 50%;
color: var(--paper-muted);
content: attr(data-stage);
font-size: 0.61rem;
transition: inherit;
}
.stage-button:hover {
color: var(--paper);
background: rgb(255 255 255 / 3%);
}
.stage-button.is-active,
.stage-button[aria-selected="true"],
.stage-button[aria-current="step"] {
color: var(--key);
background: var(--key-fade);
}
.stage-button.is-active::before,
.stage-button[aria-selected="true"]::before,
.stage-button[aria-current="step"]::before {
border-color: var(--key);
color: var(--ink-0);
background: var(--key);
box-shadow: 0 0 1.5rem rgb(200 255 98 / 18%);
}
.panel {
position: relative;
min-width: 0;
padding: clamp(1rem, 2vw, 1.5rem);
border: 1px solid var(--line);
border-radius: var(--radius-md);
background:
linear-gradient(145deg, rgb(255 255 255 / 2.6%), transparent 40%),
var(--ink-2);
box-shadow: var(--shadow-soft);
overflow: hidden;
animation: panel-in 560ms var(--ease-out) both;
}
.panel:nth-child(2) {
animation-delay: 70ms;
}
.panel:nth-child(3) {
animation-delay: 140ms;
}
.panel:nth-child(4) {
animation-delay: 210ms;
}
.panel::after {
position: absolute;
top: -2.5rem;
right: -2.5rem;
width: 7rem;
height: 7rem;
border: 1px solid rgb(200 255 98 / 8%);
border-radius: 50%;
content: "";
pointer-events: none;
}
.panel-header {
position: relative;
z-index: 1;
display: flex;
gap: 1rem;
align-items: flex-start;
justify-content: space-between;
margin: calc(clamp(1rem, 2vw, 1.5rem) * -1);
margin-bottom: 1.15rem;
padding: 0.85rem clamp(1rem, 2vw, 1.5rem);
border-bottom: 1px solid var(--line);
background: rgb(0 0 0 / 14%);
}
.panel-title {
color: var(--paper);
font-family: var(--serif);
font-size: 1.12rem;
font-weight: 500;
letter-spacing: -0.01em;
line-height: 1.25;
}
.panel-copy,
.helper-text {
max-width: 65ch;
color: var(--paper-muted);
font-size: 0.77rem;
line-height: 1.5;
}
.panel-index {
color: var(--paper-muted);
font-family: var(--mono);
font-size: 0.64rem;
letter-spacing: 0.1em;
}
.field {
display: grid;
min-width: 0;
gap: 0.45rem;
color: var(--paper-soft);
font-family: var(--mono);
font-size: 0.65rem;
font-weight: 700;
letter-spacing: 0.08em;
text-transform: uppercase;
}
.field--full {
grid-column: 1 / -1;
}
.field select,
.field input:not([type="range"]):not([type="radio"]):not([type="checkbox"]),
.field textarea {
width: 100%;
min-height: 2.75rem;
padding: 0.65rem 0.75rem;
border: 1px solid var(--line);
border-radius: var(--radius-xs);
color: var(--paper);
background: var(--ink-0);
font-family: var(--sans);
font-size: 0.85rem;
font-weight: 450;
letter-spacing: 0;
line-height: 1.35;
text-transform: none;
}
.field select {
padding-right: 2rem;
cursor: pointer;
}
.field textarea {
min-height: 6.5rem;
resize: vertical;
}
.field output {
justify-self: end;
color: var(--key);
font-family: var(--mono);
font-size: 0.7rem;
}
.field input[type="range"] {
width: 100%;
height: 1.4rem;
margin: 0;
appearance: none;
background: transparent;
cursor: pointer;
}
.field input[type="range"]::-webkit-slider-runnable-track {
height: 0.25rem;
border-radius: 999px;
background: linear-gradient(90deg, var(--key), var(--line));
}
.field input[type="range"]::-moz-range-track {
height: 0.25rem;
border-radius: 999px;
background: linear-gradient(90deg, var(--key), var(--line));
}
.field input[type="range"]::-webkit-slider-thumb {
width: 1rem;
height: 1rem;
margin-top: -0.375rem;
border: 2px solid var(--ink-0);
border-radius: 50%;
appearance: none;
background: var(--key);
box-shadow: 0 0 0 1px var(--key), 0 0 1rem rgb(200 255 98 / 35%);
}
.field input[type="range"]::-moz-range-thumb {
width: 0.8rem;
height: 0.8rem;
border: 2px solid var(--ink-0);
border-radius: 50%;
background: var(--key);
box-shadow: 0 0 0 1px var(--key), 0 0 1rem rgb(200 255 98 / 35%);
}
.segmented {
display: inline-grid;
grid-auto-columns: 1fr;
grid-auto-flow: column;
width: 100%;
padding: 0.2rem;
border: 1px solid var(--line);
border-radius: var(--radius-sm);
background: var(--ink-0);
}
.segmented button,
.segmented label {
display: grid;
min-height: 2.35rem;
place-items: center;
padding: 0.45rem 0.65rem;
border-radius: 0.36rem;
color: var(--paper-muted);
background: transparent;
cursor: pointer;
font-family: var(--mono);
font-size: 0.62rem;
font-weight: 700;
letter-spacing: 0.06em;
line-height: 1.2;
text-align: center;
text-transform: uppercase;
transition: 160ms ease;
}
.segmented button:hover,
.segmented label:hover {
color: var(--paper);
}
.segmented button.is-active,
.segmented button[aria-pressed="true"],
.segmented label:has(input:checked) {
color: var(--ink-0);
background: var(--paper);
}
.segmented input {
position: absolute;
width: 1px;
height: 1px;
opacity: 0;
}
.candidate-card {
position: relative;
display: grid;
min-height: 10.5rem;
gap: 0.7rem;
align-content: start;
padding: 1rem;
border: 1px solid var(--line);
border-radius: var(--radius-sm);
color: var(--paper-soft);
background: var(--ink-1);
text-align: left;
transition:
border-color 180ms ease,
background-color 180ms ease,
transform 180ms var(--ease-out);
}
button.candidate-card,
label.candidate-card {
width: 100%;
cursor: pointer;
}
.candidate-card:hover {
border-color: #4a5549;
background: var(--ink-3);
transform: translateY(-2px);
}
.candidate-card.is-selected,
.candidate-card[aria-pressed="true"],
.candidate-card:has(input:checked) {
border-color: var(--key-soft);
background: var(--key-fade);
box-shadow: inset 0 0 0 1px rgb(200 255 98 / 12%);
}
.candidate-card input[type="radio"],
.candidate-card input[type="checkbox"] {
position: absolute;
top: 0.9rem;
right: 0.9rem;
width: 1rem;
height: 1rem;
accent-color: var(--key);
}
.candidate-kicker {
color: var(--paper-muted);
font-family: var(--mono);
font-size: 0.59rem;
font-weight: 700;
letter-spacing: 0.12em;
text-transform: uppercase;
}
.candidate-content {
color: var(--paper);
font-family: var(--serif);
font-size: 0.98rem;
line-height: 1.45;
}
.lane-title {
color: var(--paper);
font-family: var(--serif);
font-size: clamp(1.35rem, 2.2vw, 1.85rem);
font-weight: 500;
letter-spacing: -0.025em;
line-height: 1.05;
}
.benchmark-lane-card {
min-height: 24rem;
}
.metric-list {
display: grid;
gap: 0.35rem;
padding-left: 1.1rem;
color: var(--paper-soft);
font-size: 0.75rem;
}
.benchmark-actions {
display: flex;
flex-wrap: wrap;
gap: 0.65rem;
align-items: center;
justify-content: space-between;
margin-top: 1rem;
}
.table-scroll {
max-width: 100%;
border: 1px solid var(--line-soft);
border-radius: var(--radius-sm);
overflow-x: auto;
}
.benchmark-table {
width: 100%;
border-collapse: collapse;
color: var(--paper-soft);
font-size: 0.72rem;
font-variant-numeric: tabular-nums;
}
.benchmark-table th,
.benchmark-table td {
padding: 0.65rem 0.75rem;
border-bottom: 1px solid var(--line-soft);
text-align: left;
}
.benchmark-table thead th {
color: var(--paper-muted);
background: rgb(0 0 0 / 16%);
font-family: var(--mono);
font-size: 0.58rem;
letter-spacing: 0.07em;
text-transform: uppercase;
}
.benchmark-table tbody th {
color: var(--paper);
font-weight: 600;
}
.benchmark-table tr:last-child th,
.benchmark-table tr:last-child td {
border-bottom: 0;
}
.candidate-meta {
display: flex;
flex-wrap: wrap;
gap: 0.35rem;
margin-top: auto;
}
.annotation-list {
display: grid;
gap: 0;
list-style: none;
}
.annotation-list > li,
.annotation-item {
position: relative;
display: grid;
grid-template-columns: 0.7rem minmax(0, 1fr) auto;
gap: 0.65rem;
align-items: baseline;
padding: 0.72rem 0;
border-bottom: 1px solid var(--line-soft);
color: var(--paper-soft);
font-size: 0.78rem;
}
.annotation-list > li::before,
.annotation-marker {
width: 0.48rem;
height: 0.48rem;
border: 1px solid var(--key);
border-radius: 50%;
content: "";
box-shadow: 0 0 0 0.2rem var(--key-fade);
}
.annotation-list > li:last-child,
.annotation-item:last-child {
border-bottom: 0;
}
.annotation-source {
color: var(--paper-muted);
font-family: var(--mono);
font-size: 0.58rem;
letter-spacing: 0.05em;
white-space: nowrap;
}
.loss-stack {
display: grid;
gap: 0.5rem;
}
.loss-item {
position: relative;
display: grid;
grid-template-columns: minmax(7rem, 0.7fr) minmax(0, 1.3fr) auto;
gap: 0.75rem;
align-items: center;
min-height: 3.25rem;
padding: 0.65rem 0.75rem;
border: 1px solid var(--line-soft);
border-radius: var(--radius-xs);
color: var(--paper-soft);
background: rgb(0 0 0 / 14%);
font-size: 0.72rem;
}
.loss-item::before {
position: absolute;
top: 0;
bottom: 0;
left: 0;
width: 2px;
border-radius: inherit;
background: var(--cage);
content: "";
opacity: 0.8;
}
.loss-label {
color: var(--paper);
font-weight: 650;
}
.loss-value {
color: var(--cage);
font-family: var(--mono);
font-size: 0.66rem;
font-weight: 700;
}
.metric-card {
min-width: 0;
padding: 0.8rem;
border: 1px solid var(--line-soft);
border-radius: var(--radius-sm);
background: rgb(0 0 0 / 16%);
}
.metric-label {
display: block;
margin-bottom: 0.45rem;
color: var(--paper-muted);
font-family: var(--mono);
font-size: 0.57rem;
font-weight: 700;
letter-spacing: 0.08em;
line-height: 1.35;
text-transform: uppercase;
}
.metric-value {
display: block;
color: var(--paper);
font-family: var(--serif);
font-size: clamp(1.45rem, 2.7vw, 2.15rem);
font-variant-numeric: tabular-nums;
letter-spacing: -0.035em;
line-height: 1;
}
.metric-delta {
display: block;
margin-top: 0.45rem;
color: var(--key-soft);
font-family: var(--mono);
font-size: 0.58rem;
font-variant-numeric: tabular-nums;
}
.metric-delta.is-negative {
color: var(--cage);
}
.bar {
position: relative;
width: 100%;
height: 0.35rem;
border-radius: 999px;
background: var(--ink-4);
overflow: hidden;
}
.bar > span,
.bar-fill {
display: block;
width: var(--value, 0%);
height: 100%;
border-radius: inherit;
background: var(--key);
box-shadow: 0 0 0.8rem rgb(200 255 98 / 35%);
transform-origin: left;
animation: bar-grow 680ms var(--ease-out) both;
}
.bar.is-loss > span,
.bar.is-loss .bar-fill {
background: var(--cage);
box-shadow: 0 0 0.8rem rgb(255 120 90 / 28%);
}
.bar.is-signal > span,
.bar.is-signal .bar-fill {
background: var(--signal);
box-shadow: 0 0 0.8rem rgb(120 191 255 / 28%);
}
.chart {
position: relative;
min-height: 17rem;
padding: 0.75rem;
border: 1px solid var(--line-soft);
border-radius: var(--radius-sm);
background:
linear-gradient(var(--line-soft) 1px, transparent 1px),
linear-gradient(90deg, var(--line-soft) 1px, transparent 1px),
var(--ink-1);
background-size: 2.5rem 2.5rem;
overflow: hidden;
}
.chart::after {
position: absolute;
inset: 0;
border-radius: inherit;
background: linear-gradient(90deg, transparent, rgb(200 255 98 / 3%), transparent);
content: "";
pointer-events: none;
}
.chart svg {
width: 100%;
height: 100%;
min-height: 15rem;
overflow: visible;
}
.chart text {
fill: var(--paper-muted);
font-family: var(--mono);
font-size: 0.62rem;
}
.chart .grid-line,
.chart .axis-line {
stroke: var(--line);
vector-effect: non-scaling-stroke;
}
.chart .proxy-line,
.chart .key-line {
fill: none;
stroke: var(--key);
stroke-linecap: round;
stroke-linejoin: round;
stroke-width: 2.5;
vector-effect: non-scaling-stroke;
}
.chart .holdout-line,
.chart .signal-line {
fill: none;
stroke: var(--signal);
stroke-dasharray: 5 5;
stroke-linecap: round;
stroke-linejoin: round;
stroke-width: 2;
vector-effect: non-scaling-stroke;
}
.chart .loss-line {
fill: none;
stroke: var(--cage);
stroke-linecap: round;
stroke-linejoin: round;
stroke-width: 2;
vector-effect: non-scaling-stroke;
}
.legend {
display: flex;
flex-wrap: wrap;
gap: 0.55rem 1rem;
align-items: center;
margin-top: 0.75rem;
color: var(--paper-muted);
font-family: var(--mono);
font-size: 0.59rem;
letter-spacing: 0.04em;
}
.legend-item {
display: inline-flex;
gap: 0.4rem;
align-items: center;
}
.legend-swatch {
width: 1.15rem;
height: 2px;
background: var(--key);
}
.legend-swatch.is-signal {
background: var(--signal);
}
.legend-swatch.is-loss {
background: var(--cage);
}
.receipt {
position: relative;
padding: clamp(1rem, 2vw, 1.5rem);
border: 1px solid var(--key-soft);
border-radius: var(--radius-sm);
background:
linear-gradient(135deg, var(--key-fade), transparent 45%),
var(--ink-1);
box-shadow: inset 0 0 2.5rem rgb(200 255 98 / 3%);
}
.receipt::before,
.receipt::after {
position: absolute;
left: 0;
width: 100%;
height: 4px;
background: repeating-linear-gradient(90deg, var(--ink-0) 0 5px, transparent 5px 10px);
content: "";
}
.receipt::before {
top: -2px;
}
.receipt::after {
bottom: -2px;
}
.receipt-grid {
display: grid;
grid-template-columns: minmax(8rem, 0.7fr) minmax(0, 1.3fr);
gap: 0;
}
.receipt-row {
display: contents;
}
.receipt-key,
.receipt-value {
padding: 0.58rem 0;
border-bottom: 1px dashed var(--line);
font-size: 0.7rem;
}
.receipt-key {
color: var(--paper-muted);
font-family: var(--mono);
letter-spacing: 0.06em;
text-transform: uppercase;
}
.receipt-value {
min-width: 0;
color: var(--paper);
overflow-wrap: anywhere;
}
.code-block {
max-width: 100%;
margin: 0;
padding: 1rem;
border: 1px solid var(--line);
border-radius: var(--radius-sm);
color: var(--key-soft);
background: var(--ink-0);
font-family: var(--mono);
font-size: clamp(0.68rem, 1.4vw, 0.78rem);
line-height: 1.65;
white-space: pre-wrap;
overflow: auto;
overflow-wrap: anywhere;
tab-size: 2;
}
.badge,
.pill {
display: inline-flex;
max-width: 100%;
min-height: 1.4rem;
gap: 0.3rem;
align-items: center;
padding: 0.2rem 0.48rem;
border: 1px solid var(--line);
border-radius: 999px;
color: var(--paper-muted);
background: rgb(0 0 0 / 18%);
font-family: var(--mono);
font-size: 0.54rem;
font-weight: 700;
letter-spacing: 0.06em;
line-height: 1.15;
text-transform: uppercase;
}
.badge.is-key,
.pill.is-key {
border-color: rgb(200 255 98 / 40%);
color: var(--key);
background: var(--key-fade);
}
.badge.is-loss,
.pill.is-loss {
border-color: rgb(255 120 90 / 40%);
color: var(--cage);
background: var(--cage-fade);
}
.badge.is-signal,
.pill.is-signal {
border-color: rgb(120 191 255 / 40%);
color: var(--signal);
background: var(--signal-fade);
}
.button-group {
display: flex;
flex-wrap: wrap;
gap: 0.6rem;
align-items: center;
}
.primary-button,
.secondary-button {
display: inline-flex;
min-height: 2.7rem;
gap: 0.45rem;
align-items: center;
justify-content: center;
padding: 0.65rem 0.9rem;
border: 1px solid var(--key);
border-radius: var(--radius-xs);
color: var(--ink-0);
background: var(--key);
cursor: pointer;
font-family: var(--mono);
font-size: 0.63rem;
font-weight: 800;
letter-spacing: 0.07em;
line-height: 1.2;
text-transform: uppercase;
transition:
transform 180ms var(--ease-out),
box-shadow 180ms ease,
background-color 180ms ease;
}
.primary-button:hover {
background: #d7ff8d;
box-shadow: 0 0 1.5rem rgb(200 255 98 / 16%);
transform: translateY(-1px);
}
.secondary-button {
border-color: var(--line);
color: var(--paper-soft);
background: transparent;
}
.secondary-button:hover {
border-color: var(--paper-muted);
color: var(--paper);
background: rgb(255 255 255 / 4%);
}
.footer {
display: grid;
grid-template-columns: 1fr auto;
gap: 1rem;
align-items: end;
margin-top: clamp(2.5rem, 6vw, 5rem);
padding: 1.4rem 0 0 clamp(0.85rem, 2vw, 1.5rem);
border-top: 1px solid var(--line);
color: var(--paper-muted);
font-family: var(--mono);
font-size: 0.62rem;
line-height: 1.55;
}
.empty-state {
display: grid;
min-height: 12rem;
place-items: center;
padding: 2rem;
border: 1px dashed var(--line);
border-radius: var(--radius-sm);
color: var(--paper-muted);
font-family: var(--serif);
font-style: italic;
text-align: center;
}
.skip-link {
position: fixed;
z-index: 100;
top: 0.75rem;
left: 0.75rem;
padding: 0.65rem 0.85rem;
border: 2px solid var(--ink-0);
border-radius: var(--radius-xs);
color: var(--ink-0);
background: var(--key);
box-shadow: 0 0 0 2px var(--key);
font-family: var(--mono);
font-size: 0.7rem;
font-weight: 800;
letter-spacing: 0.04em;
text-transform: uppercase;
transform: translateY(calc(-100% - 1rem));
transition: transform 160ms var(--ease-out);
}
.skip-link:focus {
transform: translateY(0);
}
}
@layer states {
[hidden] {
display: none !important;
}
button:disabled,
input:disabled,
select:disabled,
textarea:disabled {
cursor: not-allowed;
filter: saturate(0.25);
opacity: 0.52;
}
.is-loading {
cursor: progress;
}
.is-loading::before {
display: inline-block;
width: 0.75rem;
height: 0.75rem;
border: 1px solid currentColor;
border-right-color: transparent;
border-radius: 50%;
content: "";
animation: spin 750ms linear infinite;
}
@keyframes panel-in {
from {
opacity: 0;
transform: translateY(0.75rem);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@keyframes bar-grow {
from {
transform: scaleX(0);
}
to {
transform: scaleX(1);
}
}
@keyframes spin {
to {
transform: rotate(1turn);
}
}
}
@layer accessibility {
:where(a, button, input, select, textarea, [tabindex]):focus-visible {
outline: 3px solid var(--signal);
outline-offset: 3px;
}
.candidate-card:has(input:focus-visible),
.segmented label:has(input:focus-visible) {
outline: 3px solid var(--signal);
outline-offset: 3px;
}
.sr-only {
position: absolute !important;
width: 1px !important;
height: 1px !important;
padding: 0 !important;
border: 0 !important;
margin: -1px !important;
clip: rect(0, 0, 0, 0) !important;
clip-path: inset(50%) !important;
white-space: nowrap !important;
overflow: hidden !important;
}
@media (prefers-reduced-motion: reduce) {
html {
scroll-behavior: auto;
}
*,
*::before,
*::after {
scroll-behavior: auto !important;
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
}
@media (prefers-contrast: more) {
:root {
--line: #697267;
--line-soft: rgb(241 241 231 / 30%);
--paper-soft: #e1e3d8;
--paper-muted: #bac0b3;
}
.panel,
.candidate-card,
.metric-card,
.boundary-note,
.chart {
border-width: 2px;
}
}
@media (forced-colors: active) {
:root {
--key: LinkText;
--cage: Mark;
--signal: Highlight;
}
body::before,
.app-shell::before,
.panel::after,
.receipt::before,
.receipt::after {
display: none;
}
.stage-button.is-active,
.stage-button[aria-selected="true"],
.stage-button[aria-current="step"],
.candidate-card.is-selected,
.candidate-card[aria-pressed="true"] {
border: 2px solid Highlight;
}
.primary-button {
border: 2px solid ButtonText;
}
}
}
@media (max-width: 68rem) {
.masthead {
grid-template-columns: minmax(0, 1.25fr) minmax(15rem, 0.75fr);
}
.main-grid > .panel,
.main-grid > .panel--wide,
.main-grid > .panel--narrow,
.main-grid > .span-8,
.main-grid > .span-4 {
grid-column: span 6;
}
.main-grid > .panel--full,
.main-grid > .span-full {
grid-column: 1 / -1;
}
.metric-grid {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.lane-grid {
grid-template-columns: 1fr;
}
.benchmark-lane-card {
min-height: 0;
}
}
@media (max-width: 48rem) {
.app-shell {
padding-top: 0.75rem;
}
.masthead {
grid-template-columns: 1fr;
gap: 1.6rem;
align-items: start;
padding-top: 3.25rem;
}
.title {
max-width: 10ch;
font-size: clamp(3.2rem, 15vw, 5.75rem);
}
.boundary-note {
max-width: 35rem;
}
.stage-nav {
grid-template-columns: repeat(6, minmax(0, 1fr));
overflow-x: visible;
}
.stage-button {
grid-column: span 2;
min-width: 0;
min-height: 4.3rem;
flex-direction: column;
gap: 0.45rem;
align-items: flex-start;
justify-content: center;
padding-inline: 0.65rem;
font-size: 0.58rem;
letter-spacing: 0.035em;
}
.stage-button::before {
width: 1.55rem;
height: 1.55rem;
}
.main-grid > .panel,
.main-grid > .panel--wide,
.main-grid > .panel--narrow,
.main-grid > .span-8,
.main-grid > .span-4,
.main-grid > .panel--full,
.main-grid > .span-full {
grid-column: 1 / -1;
}
.control-grid {
grid-template-columns: 1fr;
}
.candidate-grid {
grid-template-columns: 1fr;
}
.candidate-card {
min-height: 8rem;
}
.footer {
grid-template-columns: 1fr;
align-items: start;
}
}
@media (max-width: 34rem) {
.app-shell {
--gutter: 0.8rem;
}
.masthead {
padding-left: 0.6rem;
}
.title {
font-size: clamp(2.95rem, 17vw, 4.7rem);
}
.subtitle {
font-size: 1.03rem;
}
.panel {
padding: 0.9rem;
border-radius: var(--radius-sm);
}
.panel-header {
margin: -0.9rem -0.9rem 1rem;
padding: 0.8rem 0.9rem;
}
.metric-grid {
grid-template-columns: 1fr;
}
.loss-item {
grid-template-columns: 1fr auto;
}
.loss-item .bar {
grid-column: 1 / -1;
grid-row: 2;
}
.receipt-grid {
grid-template-columns: 1fr;
}
.receipt-row {
display: grid;
padding: 0.55rem 0;
border-bottom: 1px dashed var(--line);
}
.receipt-key,
.receipt-value {
padding: 0;
border: 0;
}
.segmented {
grid-auto-flow: row;
grid-auto-rows: 1fr;
}
}