blindspot / frontend /src /rail /Rail.module.css
yashwrites's picture
Signs on the film, draw tool, My search off by default, example films and Radiopaedia links (part 2)
2e6a666 verified
Raw History Blame Contribute Delete
15.1 kB
/* The rail: a report sheet. Sections separated by rules, not cards (SPEC §14.2). */
.read, .result { display: flex; flex-direction: column; min-height: 100%; }
.h2 { font-size: var(--fs-3); font-weight: 700; margin: 0; padding: 13px 0 8px; letter-spacing: -0.01em; }
.h3 { font-size: var(--fs-2); font-weight: 700; margin: 0; }
.section { padding: 12px 0; border-top: 1px solid var(--report-rule); }
.row { display: flex; align-items: center; justify-content: space-between; gap: 10px; flex-wrap: wrap; }
.muted { color: var(--report-ink-muted); font-size: var(--fs-1); }
.mutedSmall { color: var(--report-ink-muted); font-size: 14px; margin: 8px 0 0; line-height: 1.4; }
.p { margin: 4px 0; line-height: 1.45; }
.count {
display: inline-block;
min-width: 1.6em;
margin-left: 6px;
padding: 0 6px;
border-radius: 10px;
background: var(--report-ink);
color: #fff;
font-size: 14px;
text-align: center;
}
.visuallyHidden { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); }
.markList, .checkList, .outcomeList, .factsList, .hintList { list-style: none; margin: 8px 0 0; padding: 0; }
.markRow {
display: grid;
grid-template-columns: 1fr auto auto;
align-items: center;
gap: 2px 8px;
padding: 5px 6px;
margin: 0 -6px;
border-radius: 4px;
}
.markRowOn { background: rgba(240, 169, 46, 0.14); }
.markPick {
display: flex;
gap: 8px;
align-items: baseline;
background: none;
border: none;
padding: 0;
cursor: pointer;
color: inherit;
text-align: left;
}
.markId, .fid { font-weight: 700; font-variant-numeric: tabular-nums; min-width: 2em; display: inline-block; }
.markId { color: #9a6200; }
.fid { color: #127a88; }
.x {
border: none;
background: none;
font-size: 20px;
line-height: 1;
color: var(--report-ink-muted);
cursor: pointer;
padding: 0 4px;
}
.x:hover { color: var(--report-ink); }
.checkRow { display: flex; align-items: center; justify-content: space-between; min-height: 34px; gap: 8px; }
.check { display: flex; align-items: center; gap: 10px; cursor: pointer; }
.check input { width: 18px; height: 18px; accent-color: var(--report-ink); margin: 0; }
.chips { display: inline-flex; gap: 3px; }
.chip {
width: 26px;
height: 26px;
border: 1px solid #b9c2ca;
border-radius: 4px;
background: #fff;
color: var(--report-ink);
font-size: 14px;
font-variant-numeric: tabular-nums;
cursor: pointer;
padding: 0;
}
.chip:hover:not(:disabled) { border-color: var(--grease-amber); }
.chipOn { background: var(--grease-amber); border-color: #c98a17; color: #1d1300; font-weight: 700; }
.chipsDark .chip { background: transparent; color: #e6ebef; border-color: #4a535c; }
/* Still unanswered: a dashed amber frame asks for it without shouting. */
.chipsNeeded { outline: 1.5px dashed #c98a17; outline-offset: 3px; border-radius: 5px; }
.chipsCaptioned { display: inline-flex; align-items: center; gap: 7px; }
.chipCap { font-size: 13px; color: var(--report-ink-muted); }
.btn {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 7px 14px;
border: 1px solid var(--report-ink);
border-radius: var(--radius);
background: #fff;
color: var(--report-ink);
cursor: pointer;
font-size: var(--fs-1);
}
.btn:hover:not(:disabled) { background: #e8ecef; }
.btn:disabled { opacity: 0.45; cursor: default; }
.linkBtn {
background: none;
border: none;
padding: 4px 0;
color: var(--report-ink-muted);
text-decoration: underline;
cursor: pointer;
font-size: var(--fs-1);
}
.primary {
width: 100%;
display: flex;
justify-content: center;
align-items: center;
gap: 10px;
padding: 12px 16px;
border: none;
border-radius: var(--radius);
background: var(--report-ink);
color: #fff;
font-size: var(--fs-2);
font-weight: 700;
cursor: pointer;
}
.primary:disabled { background: #a7b0b8; cursor: default; }
.kbd, .kbdLight {
font-family: inherit;
font-size: 12px;
padding: 1px 5px;
border-radius: 3px;
border: 1px solid #b9c2ca;
color: var(--report-ink-muted);
}
.kbdLight { border-color: rgba(255, 255, 255, 0.35); color: rgba(255, 255, 255, 0.75); }
.normalOn { scroll-margin-bottom: 128px; padding: 10px 12px; border-left: 3px solid var(--grease-amber); background: rgba(240, 169, 46, 0.1); }
.normalText { margin: 0 0 8px; font-weight: 700; }
.confirm { padding: 10px 12px; background: #fff; border: 1px solid var(--report-rule); border-radius: var(--radius); }
.confirm p { margin: 0 0 10px; }
.hintList { margin: 10px 0 0; }
/* A hint is a calm card: paper white, a thin rule, no alarm colours. */
.hintCard {
scroll-margin-bottom: 128px;
padding: 9px 12px;
margin-bottom: 6px;
background: #fff;
border: 1px solid var(--report-rule);
border-radius: var(--radius);
line-height: 1.45;
font-size: var(--fs-1);
}
.hintN { display: block; font-size: 13px; color: var(--report-ink-muted); margin-bottom: 2px; }
.error { color: #7a3d00; background: #fdf1dc; padding: 6px 10px; border-radius: 4px; font-size: var(--fs-1); }
.notice { margin: 6px 0; padding: 8px 10px; background: #e7ecef; border-radius: 4px; font-size: var(--fs-1); }
.submitBar { margin-top: auto; padding: 16px 0 12px; border-top: 1px solid var(--report-rule); position: sticky; bottom: 0; background: var(--report-paper); }
/* After submit */
.score { font-size: var(--fs-1); color: var(--report-ink-muted); display: inline-flex; align-items: baseline; gap: 5px; white-space: nowrap; }
.score strong { font-size: var(--fs-4); color: var(--report-ink); font-variant-numeric: tabular-nums; }
.scoreInfo {
align-self: center;
display: inline-grid;
place-items: center;
width: 22px;
height: 22px;
margin-left: 4px;
border-radius: 50%;
border: 1px solid #8f9aa5;
background: #fff;
color: var(--report-ink);
font-style: italic;
font-weight: 700;
font-size: 13px;
line-height: 1;
padding: 0;
cursor: pointer;
}
.scoreInfo:hover { border-color: var(--report-ink); background: #e8ecef; }
.scoreNote { margin: 8px 0 0; padding: 8px 10px; background: #e7ecef; border-radius: 4px; font-size: 14px; line-height: 1.4; }
.proxy { margin: 8px 0 0; font-size: 14px; line-height: 1.4; color: var(--report-ink-muted); }
.outcomeRow {
display: grid;
grid-template-columns: auto 1fr auto;
column-gap: 8px;
row-gap: 4px;
align-items: center;
padding: 9px 0;
border-bottom: 1px dashed var(--report-rule);
}
.outcomeChipCell, .why { grid-column: 2 / -1; justify-self: start; }
.why { font-size: 14px; line-height: 1.4; color: var(--report-ink); }
.outcomeWhat { line-height: 1.35; }
.oChip {
display: inline-flex;
align-items: center;
gap: 6px;
padding: 3px 10px;
border-radius: 999px;
font-size: 14px;
font-weight: 700;
line-height: 1.3;
white-space: nowrap;
cursor: default;
}
.oFound { background: var(--lightbox-cyan); color: #04262b; }
.oMissed { background: #fff; color: var(--report-ink); box-shadow: inset 0 0 0 2px var(--lightbox-cyan); }
.oOvercall { background: #fff; color: var(--report-ink); box-shadow: inset 0 0 0 2px var(--grease-amber); }
.oNeutral { background: #e7ecef; color: var(--report-ink); }
.oTag { color: #127a88; font-weight: 700; }
.oInfo {
display: inline-grid;
place-items: center;
width: 15px;
height: 15px;
border-radius: 50%;
border: 1px solid currentColor;
font-size: 11px;
opacity: 0.6;
}
.factsHead { font-weight: 700; margin: 8px 0 4px; }
.factsList li { padding: 3px 0; line-height: 1.4; font-size: var(--fs-1); }
.debrief { margin-top: 8px; }
.debriefHead { font-size: var(--fs-3); font-weight: 700; margin: 0 0 10px; line-height: 1.25; }
.dFinding { padding: 10px 0; border-top: 1px dashed var(--report-rule); }
.dl { margin: 8px 0 0; display: grid; grid-template-columns: 1fr; gap: 2px; }
.dl dt { font-size: 14px; color: var(--report-ink-muted); margin-top: 6px; }
.dl dd { margin: 0; line-height: 1.45; }
.dl ul { margin: 2px 0; padding-left: 18px; }
.debriefFoot { display: flex; justify-content: space-between; align-items: center; gap: 8px; margin-top: 12px; flex-wrap: wrap; }
.badge { font-size: 13px; padding: 2px 8px; border-radius: 4px; border: 1px solid var(--report-rule); color: var(--report-ink-muted); background: #fff; }
.prov_radiologist_reviewed { border-color: #127a88; color: #0c5560; }
.prov_student_reviewed { border-color: #7d8a96; color: var(--report-ink); }
.sourceLabel { font-size: 13px; color: var(--report-ink-muted); }
.sourceTag { font-size: 13px; padding: 1px 8px; border-radius: 999px; border: 1px solid var(--report-rule); color: var(--report-ink-muted); background: #fff; white-space: nowrap; }
.sourceClaude { border-color: #9aa5af; color: var(--report-ink); }
.qa { padding: 6px 0; }
.q { margin: 6px 0 2px; font-weight: 700; }
.askForm { display: flex; gap: 8px; margin-top: 8px; }
.input {
flex: 1;
min-width: 0;
padding: 7px 10px;
border: 1px solid #b9c2ca;
border-radius: var(--radius);
font: inherit;
font-size: var(--fs-1);
background: #fff;
color: var(--report-ink);
}
.nextBar { margin-top: auto; padding: 14px 0 12px; position: sticky; bottom: 0; background: var(--report-paper); border-top: 1px solid var(--report-rule); }
/* The rail (outcome chips, facts, debrief) settles as the last beat of the reveal, after the outlines and arrows. */
.settle { animation: settle 260ms ease-out 1050ms both; }
@keyframes settle { from { opacity: 0; transform: translateY(4px); } to { opacity: 1; transform: none; } }
@media (prefers-reduced-motion: reduce) { .settle { animation: none; } }
/* ---- Round 3: the read, in the order of thinking ---- */
.step {
display: inline-grid;
place-items: center;
width: 1.45em;
height: 1.45em;
margin-right: 8px;
border-radius: 50%;
background: var(--report-ink);
color: #fff;
font-size: 13px;
font-weight: 700;
vertical-align: 2px;
}
.help { margin: 3px 0 0; color: var(--report-ink-muted); font-size: 14px; line-height: 1.4; }
.sub { margin: 10px 0 5px; font-size: var(--fs-1); font-weight: 700; }
.mutedLine { margin: 0; color: var(--report-ink-muted); font-size: 14px; }
.pickGrid { display: grid; grid-template-columns: 1fr 1fr; gap: 4px 10px; }
.pickCell { display: flex; align-items: center; gap: 5px; min-width: 0; }
.pick {
flex: 1;
min-width: 0;
text-align: left;
padding: 4px 9px;
border: 1px solid #b9c2ca;
border-radius: 4px;
background: #fff;
color: var(--report-ink);
font-size: var(--fs-1);
cursor: pointer;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.pick:hover:not(:disabled) { border-color: var(--grease-amber); }
.pick:disabled { cursor: default; }
.pickOn { background: var(--grease-amber); border-color: #c98a17; color: #1d1300; font-weight: 700; }
.pickNotSure { color: var(--report-ink-muted); }
.pickNotSure.pickOn { color: #1d1300; }
/* The tenth cell ("not sure") has no "i": keep its button as wide as the others. */
.pickCell:last-child { padding-right: 27px; }
.armedLine { margin: 6px 0 0; min-height: 1.4em; font-size: 14px; color: var(--report-ink-muted); line-height: 1.4; }
.armedLine strong { color: #7a4d00; }
.marksBlock { margin-top: 4px; }
.need { grid-column: 1 / -1; font-size: 13px; color: #7a4d00; padding-left: calc(2em + 8px); }
.groupOff > :not(.offNote) { opacity: 0.45; }
.offNote { margin: 6px 0 0; font-size: 14px; color: var(--report-ink); }
.checkGrid { list-style: none; margin: 6px 0 0; padding: 0; display: grid; grid-template-columns: 1fr 1fr; gap: 0 10px; }
.sureRow { display: flex; align-items: center; justify-content: space-between; gap: 6px 10px; margin: 6px 0 2px; flex-wrap: wrap; }
.sureLabel { font-size: 14px; color: var(--report-ink-muted); }
.sureLabel strong { color: var(--report-ink); }
.normalOn .btn { margin-top: 4px; }
.submitHelp { color: var(--report-ink); font-size: 14px; margin: 8px 0 0; line-height: 1.4; }
.read :is(button, input, a):focus-visible, .result :is(button, input, a):focus-visible { outline: 2px solid #9a6200; outline-offset: 2px; }
/* Tutor status banner at the top of the rail (TutorNotice). */
.tutorNotice { margin: 12px 0 2px; }
/* Volumes: where a mark sits, and the size step under a mass-like mark. */
.markPlace { font-weight: 400; color: var(--report-ink-muted); font-size: 13px; white-space: nowrap; }
.sizeStep { grid-column: 1 / -1; display: flex; flex-wrap: wrap; align-items: center; gap: 6px 10px; padding: 4px 0 2px calc(2em + 8px); font-size: 14px; }
.sizeLabel { font-weight: 700; }
.sizeHint { color: var(--report-ink-muted); font-variant-numeric: tabular-nums; }
.sizeVerdict { grid-column: 1 / -1; font-size: 13px; color: var(--report-ink-muted); padding-left: calc(2em + 8px); }
/* ---- Round 5: under "What it looks like" — signs on the film, example films, Radiopaedia ---- */
.teach { margin-top: 6px; display: grid; gap: 6px; }
.teachCompact { grid-column: 1 / -1; padding-left: calc(2em + 8px); }
.teachRow { display: grid; gap: 3px; }
.teachLabel { font-size: 13px; color: var(--report-ink-muted); }
.signChips { display: flex; flex-wrap: wrap; gap: 4px 6px; }
.signChip {
display: inline-flex;
align-items: center;
gap: 4px;
padding: 2px 10px;
border: 1px solid #127a88;
border-radius: 999px;
background: #fff;
color: var(--report-ink);
font-size: 14px;
line-height: 1.4;
cursor: pointer;
white-space: nowrap;
max-width: 100%;
overflow: hidden;
text-overflow: ellipsis;
}
.signChip:hover { background: #e3f6f9; }
.signChipKey { color: #127a88; font-weight: 700; }
.thumbs { display: flex; gap: 8px; flex-wrap: wrap; }
.thumb {
display: grid;
gap: 3px;
padding: 0;
border: none;
background: none;
color: var(--report-ink);
text-align: left;
cursor: pointer;
width: fit-content;
max-width: calc(50% - 4px);
font: inherit;
}
/* 120 px tall at the film's own aspect ratio, so the cyan outline (an SVG stretched over the box) lands on the lesion. */
.thumbFilm, .thumbVol { position: relative; display: block; height: 120px; width: auto; max-width: 100%; background: var(--film-black); border-radius: 3px; overflow: hidden; }
.thumbFilm img { position: absolute; inset: 0; width: 100%; height: 100%; display: block; object-fit: fill; user-select: none; }
.thumbFilm svg { position: absolute; inset: 0; width: 100%; height: 100%; }
.thumbVol :is(figure) { margin: 0; height: 100%; }
.thumbVol { width: 120px; }
.thumbVol :is(figure) > div { height: 120px !important; }
.thumbOutline { fill: var(--lightbox-cyan); fill-opacity: 0.06; stroke: var(--lightbox-cyan); stroke-width: 2px; stroke-linejoin: round; vector-effect: non-scaling-stroke; }
.thumb:hover .thumbFilm, .thumb:hover .thumbVol { outline: 2px solid var(--lightbox-cyan); }
.thumbCap { display: grid; font-size: 12px; line-height: 1.3; }
.thumbWhere { color: var(--report-ink); overflow: hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; }
.thumbSet { color: var(--report-ink-muted); }
.ext { color: var(--report-ink); font-weight: 700; font-size: 14px; }
.linksOnly { font-size: 12px; color: var(--report-ink-muted); }
.lookFor { margin: 6px 0 0; font-size: 14px; line-height: 1.4; }
.lookFor strong { color: #127a88; }