Open horizon
Ascora's score history as terrain, a contour ridge stacked from the series itself with plotted landmarks.
Ascora reads score history as an open horizon: terrain stacked from contour plates the way a
laser-cut survey model is, with the data points plotted as landmarks. openHorizon builds it
from the series itself.
The terrain is the data
This is the part that matters, and the easy part to get wrong by reaching for noise because it looks good. Every band is the footprint where the series sits at or above one level, so the shape you see is the score and nothing else.
A series that dips below a level and climbs back splits that band into two separate landforms. Pull the explode slider and the missed payment in month seven shows up as a gap running through the upper plates — the dip becoming terrain rather than a kink in a line.
Band edges are interpolated at the crossing rather than snapped to the nearest sample, so plate boundaries land where the score actually crossed.
import { openHorizon } from '@/components/relief/lib/ridge';
const assembly = openHorizon(
scores,
[{ index: 6, label: 'Missed payment', detail: '−31 in one month' }],
);openHorizon takes the real series. An empty state passes a placeholder series through the
same generator, which is what keeps the empty and populated views one visual language
instead of two drawings that have to be kept in sync.
Accessibility
- The scene carries one
labeldescribing the illustration as a whole; the canvas isaria-hiddenwithout it. On a stage that label is the beat's subtext, so the line a sighted reader sees and the line a screen reader hears are the same sentence. - Nothing in the geometry is text, and nothing in it is focusable.
Install
shadcn add @gesso/relief-contour