Reading map: measure the marker contrast instead of asserting it

The ember-scheme override was sky blue against the fuchsia quoted marker,
which measures deltaE 0.5 under deuteranopia — the two rings would have been
the same colour to a deuteranope, and telling them apart is the one job these
hues actually have. White is the only candidate clearing all three of that
scheme's marks (worst case 30.4; cyan managed 7.8, lime 8.5).

Also records honestly that amber vs the trace green is 4.8 under protanopia,
accepted on the same grounds the ember scheme already documents, and drops the
border-top when the reading widget is the rail's only child — on a page with
fewer than two headings it was a separator with nothing above it.

Counts in the module docstring were still 262/206; they are 273/215.
This commit is contained in:
wes
2026-08-14 08:54:46 -04:00
parent 3039ff45ed
commit 51b4033541
3 changed files with 32 additions and 10 deletions
+9
View File
@@ -78,6 +78,15 @@
} }
.reading-now[hidden] { display: none; } .reading-now[hidden] { display: none; }
/* The rule above is a separator from the table of contents. On a page with fewer than two
headings there is no table of contents, this is the rail's only child, and the border then
hangs over nothing — reads as a stray line rather than a division. */
.reading-now:first-child {
margin-top: 0;
padding-top: 0;
border-top: none;
}
.reading-now__label { .reading-now__label {
margin: 0 0 0.5rem; margin: 0 0 0.5rem;
font-size: 0.72rem; font-size: 0.72rem;
+3 -1
View File
@@ -10,7 +10,9 @@
* • `trace` is pre-sorted chronologically and MUST NOT be re-sorted. `t` is date-only and * • `trace` is pre-sorted chronologically and MUST NOT be re-sorted. `t` is date-only and
* many highlights share a day, so array order is the only thing carrying the sequence. * many highlights share a day, so array order is the only thing carrying the sequence.
* • There is no `has_highlight` flag. The signal set is the distinct `trace[].node` values — * • There is no `has_highlight` flag. The signal set is the distinct `trace[].node` values —
* 262 highlights over 206 chunks, because one passage can be highlighted more than once. * 273 highlights over 215 chunks, because one passage can be highlighted more than once.
* • Each entry carries `h`, the highlight's text_hash. It is the join key
* api.c0smere.net/highlights/random returns beside the header quote; see markQuoted().
*/ */
import * as THREE from 'three'; import * as THREE from 'three';
+20 -9
View File
@@ -37,11 +37,18 @@
--map-trace: var(--link-bright, #46c421); --map-trace: var(--link-bright, #46c421);
/* --- the two standing markers ------------------------------------------------------------ /* --- the two standing markers ------------------------------------------------------------
Drawn as rings, so colour is not what tells them from the point cloud — outline-versus-dot --map-newest: the most recent highlight. --map-quoted: the passage quoted in the header.
already does, the same form-carries-the-distinction argument the schemes below rest on. Drawn as rings, so colour is not what separates them from the cloud — outline-versus-dot
These hues only have to separate the two markers from EACH OTHER, and amber↔fuchsia holds does, the same form-carries-the-distinction argument the schemes below rest on.
up under protanopia (ΔE 18.7) where amber↔green would not.
--map-newest: the most recent highlight. --map-quoted: the passage in the page header. */ What colour DOES have to carry is telling the two markers apart, and it does that well:
amber↔fuchsia is ΔE 52.9 normal, 59.6 protan, 56.5 deutan (colorspacious, severity 100).
⚠️ Measured honestly: amber↔trace-green is only **ΔE 4.8 under protanopia**. A protanope
cannot tell the newest ring from the trace line by hue. Accepted on the same grounds the
`ember` scheme below is accepted — nothing here is *encoded* by colour, a closed ring and a
polyline are different shapes, and no reader ever has to answer a question by telling those
two hues apart. Fuchsia has no such problem (ΔE 61.2 protan against the trace). */
--map-newest: #f59e0b; --map-newest: #f59e0b;
--map-quoted: #e879f9; --map-quoted: #e879f9;
@@ -69,10 +76,14 @@
.reading-map--ember { .reading-map--ember {
--map-signal: #f59e0b; --map-signal: #f59e0b;
--map-trace: var(--link-bright, #46c421); --map-trace: var(--link-bright, #46c421);
/* The default newest-marker amber IS this scheme's signal colour, which would make the ring /* The default newest-marker amber IS this scheme's signal colour here, which would make the
look like a highlight that had merely grown a hole. Sky blue is the furthest thing from ring look like a highlight that had merely grown a hole.
both marks here. */ ⚠️ Sky blue (#38bdf8) was the obvious substitute and is **wrong**: against the fuchsia
--map-newest: #38bdf8; quoted-marker it measures ΔE 0.5 under deuteranopia — the two rings would be the same
colour to a deuteranope, which is the one distinction these hues actually have to carry.
White is the only candidate that clears all three of this scheme's marks (worst case
ΔE 30.4 across normal/protan/deutan); cyan managed 7.8 and lime 8.5. */
--map-newest: #e8eef6;
} }
/* --- scheme: frost -------------------------------------------------------------------------- /* --- scheme: frost --------------------------------------------------------------------------