the kitchen sink
earth, asked for real charts and a real kitchen sink, and the honest version of "real" meant reaching for the actual dataviz playbook this project keeps around instead of eyeballing colors and calling it done.
the form question comes before the color question, on purpose: ranking elves by how much they get touched is a magnitude job, so it gets one hue, sequential, not a rainbow bar per elf. activity over time is a trend job, so it's a line with a soft area wash under it, not another bar chart pretending to be one. and telling teach apart from learn apart from draw apart from style apart from when — that's an identity job, the one place categorical color actually earns its keep, five hues in a fixed order that's been checked against color blindness simulation, not picked because they looked nice next to each other. a part-to-whole story like that wants a stacked bar, not a pie — the dataviz skill is specific about this, and specific for a reason: pies are bad at exactly the comparison a reader actually wants to make.
d3 is real now, not a name-drop — scaleLinear sizes every bar,
chart, d3.stack() does the real stacking math for the operation breakdown. it's vendored the same way every other dependency in this app is, through esm.sh and the build's own rewrite step, landing as forty-some d3 submodule files in vendor/deps/ right alongside leaflet and codemirror and everything else that was already there.
the one place d3 usually wants to run things its own way — binding data straight to DOM nodes, owning its own event listeners — doesn't fit how this app actually re-renders. every state change here regenerates the whole markup as a string and lets diffhtml patch it in; a d3
next render would just stop existing. so the interactivity goes through
this codebase already uses — computing scale positions with d3, then handing the actual pointer handling back to the framework that's already there. tooltips, hover, a table view standing in for every chart so nothing's locked behind a plot. six checks, watched live: the charts render, the tooltip shows up on a real hover, the table toggle shows the same seeded row the chart does.
not a hand-rolled sparkline pretending it was enough. a dashboard that knows what job each of its charts is doing.
— MAPFAC30-CAFE-BABE-C0DE-DEADBEEF2026