@tangle-network/charts 0.8.0 → 0.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +40 -2
- package/dist/figure.css +64 -6
- package/dist/index.d.ts +39 -4
- package/dist/index.js +737 -124
- package/dist/react/index.d.ts +2 -6
- package/dist/react/index.js +1 -1
- package/dist/react/live.css +2 -0
- package/dist/{timeline-CCWFvLxg.js → timeline-BAwebuqb.js} +69 -14
- package/dist/{timeline-CCEJug7n.d.ts → timeline-CNHABOS1.d.ts} +80 -5
- package/package.json +1 -1
package/dist/react/index.d.ts
CHANGED
|
@@ -1,9 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { N as Refusal, O as Figure, S as YTick, _ as MarkVerdict, b as YScale, d as PointFields, f as PointGlyph, g as MarkKind, h as ChartMark, i as TimelineTick, l as TickOutcome, m as ChartBand, n as TimelineOptions, p as BandKind, r as TimelineSpan, t as TimelineLane, v as MarkerShape, x as YTarget, y as XCategory } from "../timeline-CNHABOS1.js";
|
|
2
2
|
import { ReactElement, ReactNode } from "react";
|
|
3
|
-
//#region src/svg.d.ts
|
|
4
|
-
/** Point shapes: the second channel that keeps series distinct without colour. */
|
|
5
|
-
type MarkerShape = "circle" | "square" | "triangle" | "diamond";
|
|
6
|
-
//#endregion
|
|
7
3
|
//#region src/react/sparkline.d.ts
|
|
8
4
|
type SparklineDirection = "rising" | "falling" | "flat";
|
|
9
5
|
type SparklineValues = readonly (number | null)[];
|
|
@@ -269,4 +265,4 @@ interface TimelineViewProps {
|
|
|
269
265
|
}
|
|
270
266
|
export declare function TimelineView({ lanes, options, defaultCollapsed, presentation }: TimelineViewProps): import("react").JSX.Element;
|
|
271
267
|
//#endregion
|
|
272
|
-
export type { BandKind, ChartBand, ChartMark, Figure, FigureViewProps, LineSeries, MarkKind, MarkVerdict, MarkerShape, MeterSegment, Refusal, SparklineDirection, SparklineGeometry, SparklineGeometryOptions, SparklineLabelOptions, SparklinePoint, SparklineProps, SparklineValues, StackedBarBucket, StackedBarChartProps, StackedBarSegment, StackedBarSeries, TickOutcome, TimelineLane, TimelineOptions, TimelineSpan, TimelineTick, TimelineViewProps, WaterfallBarProps, WaterfallHeaderProps, WaterfallRowProps, WaterfallSpanGeometry, WaterfallTimeAxisProps, WaterfallWindow };
|
|
268
|
+
export type { BandKind, ChartBand, ChartMark, Figure, FigureViewProps, LineSeries, MarkKind, MarkVerdict, MarkerShape, MeterSegment, PointFields, PointGlyph, Refusal, SparklineDirection, SparklineGeometry, SparklineGeometryOptions, SparklineLabelOptions, SparklinePoint, SparklineProps, SparklineValues, StackedBarBucket, StackedBarChartProps, StackedBarSegment, StackedBarSeries, TickOutcome, TimelineLane, TimelineOptions, TimelineSpan, TimelineTick, TimelineViewProps, WaterfallBarProps, WaterfallHeaderProps, WaterfallRowProps, WaterfallSpanGeometry, WaterfallTimeAxisProps, WaterfallWindow, XCategory, YScale, YTarget, YTick };
|
package/dist/react/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { K as markerPath, U as hatchPath, _ as markName, c as MARK_HEADS, p as eventsGap, t as timeline, v as isRefusal } from "../timeline-BAwebuqb.js";
|
|
2
2
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { Fragment as Fragment$1, useEffect, useId, useMemo, useRef, useState } from "react";
|
|
4
4
|
//#region src/react/sparkline.tsx
|
package/dist/react/live.css
CHANGED
|
@@ -48,6 +48,8 @@ line.ov-gridline { stroke: color-mix(in srgb, var(--chart-live-faint, #777) 22%,
|
|
|
48
48
|
.ov-band-after-pass { fill: color-mix(in srgb, var(--chart-live-pass, var(--chart-pass, var(--status-running))) 12%, transparent); }
|
|
49
49
|
.ov-band-idle { fill: var(--chart-live-hover, var(--chart-shade)); }
|
|
50
50
|
.ov-band-blocked { fill: color-mix(in srgb, var(--chart-live-danger, var(--chart-breach, var(--status-error))) 9%, transparent); }
|
|
51
|
+
/* A group band labels a run of positions; in the live renderer it is an outline, never a fill over the data. */
|
|
52
|
+
.ov-band-group { fill: none; stroke: var(--chart-live-border, var(--chart-rule)); stroke-dasharray: 2 3; }
|
|
51
53
|
/* Missing data is hatched, never drawn as zero. */
|
|
52
54
|
.ov-hatch-bg { fill: color-mix(in srgb, var(--chart-live-faint, var(--chart-muted)) 10%, transparent); }
|
|
53
55
|
.ov-hatch { fill: none; stroke: var(--chart-live-faint, var(--chart-muted)); stroke-width: 1; }
|
|
@@ -555,7 +555,8 @@ const BAND_KINDS = [
|
|
|
555
555
|
"after-pass",
|
|
556
556
|
"idle",
|
|
557
557
|
"missing",
|
|
558
|
-
"blocked"
|
|
558
|
+
"blocked",
|
|
559
|
+
"group"
|
|
559
560
|
];
|
|
560
561
|
/** The head shape of each kind that has one, shared with the React marks. */
|
|
561
562
|
const MARK_HEADS = {
|
|
@@ -577,10 +578,14 @@ function eventsGap(marks = [], bands = [], domain) {
|
|
|
577
578
|
for (const band of bands) {
|
|
578
579
|
if (!band || typeof band.label !== "string" || !band.label.trim()) return "Every band needs a label.";
|
|
579
580
|
if (!BAND_KINDS.includes(band.kind)) return `${band.label}: unknown band kind.`;
|
|
580
|
-
if (!Number.isFinite(band.from) || !Number.isFinite(band.to) || band.from >= band.to || !inside(band.from) || !inside(band.to)) return `${band.label}: a band needs finite, increasing bounds inside the axis domain.`;
|
|
581
|
+
if (!Number.isFinite(band.from) || !Number.isFinite(band.to) || (band.kind === "group" ? band.from > band.to : band.from >= band.to) || !inside(band.from) || !inside(band.to)) return `${band.label}: a band needs finite, increasing bounds inside the axis domain.`;
|
|
581
582
|
}
|
|
582
583
|
return null;
|
|
583
584
|
}
|
|
585
|
+
/** An `event` whose source is `gap`: a break in time between positions of an ordinal axis. It never crosses the data. */
|
|
586
|
+
function isGap(mark) {
|
|
587
|
+
return mark.kind === "event" && mark.source === "gap";
|
|
588
|
+
}
|
|
584
589
|
/** A mark's label with its source, as drawn and listed. */
|
|
585
590
|
function markName(mark) {
|
|
586
591
|
return mark.source ? `${mark.label} · ${mark.source}` : mark.label;
|
|
@@ -593,16 +598,44 @@ function markKindLabel(mark) {
|
|
|
593
598
|
mark.lane && `lane ${mark.lane}`
|
|
594
599
|
].filter(Boolean).join(" · ");
|
|
595
600
|
}
|
|
596
|
-
/**
|
|
597
|
-
|
|
601
|
+
/**
|
|
602
|
+
* Bands sit under the data; a missing band is hatched over a neutral wash. A band is clipped to `clip` when given.
|
|
603
|
+
* `extent` maps a band's bounds to pixels when a bound covers more than a point, such as a column of an ordinal axis.
|
|
604
|
+
* Group bands are drawn by `drawGroups`, not here.
|
|
605
|
+
*/
|
|
606
|
+
function drawBands(bands, px, top, bottom, format, clip, extent) {
|
|
598
607
|
return bands.map((band) => {
|
|
608
|
+
if (band.kind === "group") return "";
|
|
599
609
|
const from = clip ? Math.max(band.from, clip[0]) : band.from, to = clip ? Math.min(band.to, clip[1]) : band.to;
|
|
600
610
|
if (to <= from) return "";
|
|
601
|
-
const
|
|
611
|
+
const [x0, x1] = extent ? extent(from, to) : [px(from), px(to)];
|
|
612
|
+
const x = x0, w = x1 - x0, cls = `tgc-band tgc-band-${band.kind}`;
|
|
602
613
|
const mark = band.kind === "missing" ? hatch(x, top, w, bottom - top, cls) : rect(x, top, w, bottom - top, cls) + (band.kind === "blocked" ? line(x, top, x + w, top, "tgc-band-wall") : "");
|
|
603
614
|
return titled(`${band.label}: ${format(band.from)} to ${format(band.to)}`, `<g data-band="${band.kind}">${mark}</g>`);
|
|
604
615
|
}).join("");
|
|
605
616
|
}
|
|
617
|
+
/** The header row height `drawGroups` needs, or 0 without group bands. */
|
|
618
|
+
function groupRowHeight(bands = []) {
|
|
619
|
+
return bands.some((band) => band.kind === "group") ? 18 : 0;
|
|
620
|
+
}
|
|
621
|
+
/**
|
|
622
|
+
* Group bands as labelled brackets in the header row that ends at `top`, with a rule at each inner edge through the
|
|
623
|
+
* data. A label that does not fit its bracket is cut with an ellipsis; the full label is the bracket's hover.
|
|
624
|
+
*/
|
|
625
|
+
function drawGroups(bands, extent, top, bottom, left, right, format, clip) {
|
|
626
|
+
return bands.filter((band) => band.kind === "group").map((band) => {
|
|
627
|
+
const from = clip ? Math.max(band.from, clip[0]) : band.from, to = clip ? Math.min(band.to, clip[1]) : band.to;
|
|
628
|
+
if (to < from) return "";
|
|
629
|
+
const [x0, x1] = extent(from, to), w = x1 - x0;
|
|
630
|
+
const label = w >= 24 ? wrap(band.label, w - 10, 11, "sans", 1).lines[0] : "";
|
|
631
|
+
const edges = [x0, x1].filter((x) => x > left + .5 && x < right - .5).map((x) => line(x, top - 16, x, bottom, "tgc-group-edge")).join("");
|
|
632
|
+
const bracket = line(x0 + 2, top - 3, x1 - 2, top - 3, "tgc-group-rule") + (label ? text(x0 + 3, top - 7, label, {
|
|
633
|
+
size: 11,
|
|
634
|
+
cls: "tgc-group-label"
|
|
635
|
+
}) : "");
|
|
636
|
+
return titled(`${band.label}: ${format(band.from)} to ${format(band.to)}`, `<g data-band="group">${edges}${bracket}</g>`);
|
|
637
|
+
}).join("");
|
|
638
|
+
}
|
|
606
639
|
/** Marks of one kind and verdict merge when under 3 px apart, or under 12 px apart with the same label (a re-checked tag). */
|
|
607
640
|
function groupMarks(marks, px) {
|
|
608
641
|
const groups = [];
|
|
@@ -645,7 +678,7 @@ function layoutLabels(groups, left, right, o) {
|
|
|
645
678
|
const [w0, w1] = o.window ?? [-Infinity, Infinity];
|
|
646
679
|
const edges = [...(o.after ?? []).map((mark) => place(`${markName(mark)} +${duration(mark.at - w1)} →`, right, right, "end", false)), ...(o.before ?? []).map((mark) => place(`← ${markName(mark)} −${duration(w0 - mark.at)}`, left, left, "start", false))].filter((p) => p !== null);
|
|
647
680
|
const placed = /* @__PURE__ */ new Map();
|
|
648
|
-
for (const group of groups) {
|
|
681
|
+
for (const group of [...groups.filter((g) => !isGap(g.marks[0])), ...groups.filter((g) => isGap(g.marks[0]))]) {
|
|
649
682
|
const flip = group.x > left + (right - left) * .62;
|
|
650
683
|
const spot = place(markName(group.marks[0]) + (group.marks.length > 1 ? ` (+${group.marks.length - 1})` : ""), group.x + 4, group.x - 4, flip ? "end" : "start", true);
|
|
651
684
|
if (spot) placed.set(group, spot);
|
|
@@ -676,7 +709,7 @@ function drawMarks(marks, px, top, bottom, left, right, format, labelTop = top,
|
|
|
676
709
|
const rowY = (row) => labelTop + 12 + row * 14;
|
|
677
710
|
let out = groups.map((group) => {
|
|
678
711
|
const { x, marks: members } = group, mark = members[0];
|
|
679
|
-
const stem = MARK_HEADS[mark.kind] !== void 0 && mark.kind !== "ruling";
|
|
712
|
+
const stem = MARK_HEADS[mark.kind] !== void 0 && mark.kind !== "ruling" || isGap(mark);
|
|
680
713
|
let glyph = line(x, Math.min(top, labelTop), x, stem ? top + 4 : bottom, `tgc-mark tgc-mark-${mark.kind}`);
|
|
681
714
|
if (mark.kind === "died") glyph += line(x - 4, bottom - 8, x + 4, bottom, "tgc-mark tgc-mark-died") + line(x - 4, bottom, x + 4, bottom - 8, "tgc-mark tgc-mark-died");
|
|
682
715
|
glyph += markHead(mark.kind, x, top + 4);
|
|
@@ -733,20 +766,42 @@ function eventsTable(marks, bands, axisLabel, format) {
|
|
|
733
766
|
}
|
|
734
767
|
const EVENTS_READ = "Vertical rules mark recorded events (solid: pass, dashed: deadline, cross: died, dotted: other; a diamond is a release, a triangle a steer, a square a ruling and a circle a wake, coloured by verdict when one is recorded); tinted spans are recorded periods, a wall-topped span is a system-wide block, and hatched spans have no data.";
|
|
735
768
|
//#endregion
|
|
736
|
-
//#region src/
|
|
769
|
+
//#region src/outcomes.ts
|
|
737
770
|
/**
|
|
738
|
-
*
|
|
739
|
-
*
|
|
771
|
+
* Outcomes in stack order. Adjacent outcomes pass the colour-vision checks in both themes in this order, so a stacked
|
|
772
|
+
* bar keeps it; `aborted` and `other` share the neutral tone and always carry a label. An attempt still running is
|
|
773
|
+
* `open` and is drawn hatched, never as an outcome.
|
|
740
774
|
*/
|
|
741
|
-
const
|
|
775
|
+
const OUTCOME_ORDER = [
|
|
742
776
|
"ok",
|
|
743
777
|
"quota",
|
|
778
|
+
"lost",
|
|
744
779
|
"rate-limit",
|
|
745
780
|
"oom",
|
|
746
781
|
"refused",
|
|
747
782
|
"aborted",
|
|
748
783
|
"other"
|
|
749
784
|
];
|
|
785
|
+
/** The CSS colour of each outcome, for a caller that paints its own marks (a legend, a stacked bar). */
|
|
786
|
+
const OUTCOME_COLORS = Object.freeze(Object.fromEntries(OUTCOME_ORDER.map((outcome) => [outcome, `var(--chart-outcome-${outcome === "aborted" || outcome === "other" ? "neutral" : outcome})`])));
|
|
787
|
+
/** How many checkers have their own hue. Index 0 is the current checker; later indexes are older checkers. */
|
|
788
|
+
const CHECKER_HUES = 4;
|
|
789
|
+
/** The CSS colour of checker `index` (0 is current). Indexes past the fourth hue fold into the muted tone. */
|
|
790
|
+
function checkerColor(index) {
|
|
791
|
+
return Number.isInteger(index) && index >= 0 && index < 4 ? `var(--chart-checker-${index})` : "var(--chart-muted)";
|
|
792
|
+
}
|
|
793
|
+
/** The class a figure puts on a series drawn in checker `index`'s colour. */
|
|
794
|
+
function checkerClass(index) {
|
|
795
|
+
if (index === void 0) return "";
|
|
796
|
+
return Number.isInteger(index) && index >= 0 && index < 4 ? `tgc-checker-${index}` : "tgc-checker-other";
|
|
797
|
+
}
|
|
798
|
+
//#endregion
|
|
799
|
+
//#region src/timeline.ts
|
|
800
|
+
/**
|
|
801
|
+
* Lanes of recorded spans on one time axis, with recorded marks; an open span runs to the supplied `now`. Lanes can
|
|
802
|
+
* form a tree (`parent`), carry attempt ticks coloured by outcome with ok and failed counts, and fold by subtree.
|
|
803
|
+
*/
|
|
804
|
+
const TICK_OUTCOMES = OUTCOME_ORDER;
|
|
750
805
|
const utcClock = (ms) => new Date(ms).toISOString().slice(11, 16);
|
|
751
806
|
const MIN = 6e4;
|
|
752
807
|
const DAY = 864e5;
|
|
@@ -955,10 +1010,10 @@ function timeline(lanes, o) {
|
|
|
955
1010
|
after,
|
|
956
1011
|
window: [t0, t1]
|
|
957
1012
|
});
|
|
958
|
-
const top = 8 + (labelRows ? labelRows * 14 + 6 : 0);
|
|
1013
|
+
const top = 8 + (labelRows ? labelRows * 14 + 6 : 0) + groupRowHeight(bands);
|
|
959
1014
|
const rowH = phone ? 40 : 24, bottom = top + rows.length * rowH;
|
|
960
1015
|
const barTop = (y) => y + (phone ? 19 : 5), barH = 14;
|
|
961
|
-
let body = drawBands(bands, px, top, bottom, fmt, [t0, t1]);
|
|
1016
|
+
let body = drawBands(bands, px, top, bottom, fmt, [t0, t1]) + drawGroups(bands, (from, to) => [px(from), px(to)], top, bottom, left, right, fmt, [t0, t1]);
|
|
962
1017
|
for (const t of axisTicks(t0, t1, px, left, right, axisLabel)) body += line(px(t), top, px(t), bottom, "tgc-gridline") + text(px(t), bottom + 16, axisLabel(t), {
|
|
963
1018
|
size: 11,
|
|
964
1019
|
cls: "tgc-ink-muted tgc-num",
|
|
@@ -1127,4 +1182,4 @@ function axisTicks(t0, t1, px, left, right, label) {
|
|
|
1127
1182
|
return fit([t0, t1]) ? [t0, t1] : [t0];
|
|
1128
1183
|
}
|
|
1129
1184
|
//#endregion
|
|
1130
|
-
export {
|
|
1185
|
+
export { esc as $, pts as A, MARKER_SHAPES as B, duration as C, kn as D, intervalName as E, tierSummary as F, line as G, hatch as H, tierTotal as I, rect as J, markerPath as K, usd as L, rateIntervalGap as M, rateOrder as N, pct as O, tierAtLeast as P, capitalize as Q, usdTick as R, drawable as S, intervalGap as T, hatchPath as U, circle as V, hbar as W, text as X, svgRoot as Y, titled as Z, markName as _, checkerClass as a, wrap as at, TIERS_BEST_FIRST as b, MARK_HEADS as c, drawGroups as d, fitLines as et, drawMarks as f, markLabelRows as g, groupRowHeight as h, OUTCOME_ORDER as i, textWidth as it, rateDataGap as j, perPass as k, MARK_VERDICTS as l, eventsTable as m, CHECKER_HUES as n, plural as nt, checkerColor as o, eventsGap as p, polyline as q, OUTCOME_COLORS as r, textBlock as rt, EVENTS_READ as s, timeline as t, listJoin as tt, drawBands as u, isRefusal as v, estimateNote as w, costText as x, METHOD_NAME as y, table as z };
|
|
@@ -132,6 +132,31 @@ interface Refusal {
|
|
|
132
132
|
}
|
|
133
133
|
declare function isRefusal(value: Figure | Refusal): value is Refusal;
|
|
134
134
|
//#endregion
|
|
135
|
+
//#region src/axis.d.ts
|
|
136
|
+
/** One column of an ordinal x axis. Points sit at a category's `at`; `weight` scales its width (default 1). */
|
|
137
|
+
interface XCategory {
|
|
138
|
+
at: number;
|
|
139
|
+
label: string;
|
|
140
|
+
weight?: number;
|
|
141
|
+
}
|
|
142
|
+
/** A recorded goal on the y axis, such as a paper's bar: a band from `from` to `to`, or a line when they are equal. */
|
|
143
|
+
interface YTarget {
|
|
144
|
+
from: number;
|
|
145
|
+
to: number;
|
|
146
|
+
label: string;
|
|
147
|
+
kind: "target" | "stretch";
|
|
148
|
+
}
|
|
149
|
+
/** A caller-named gridline, such as a check stage. */
|
|
150
|
+
interface YTick {
|
|
151
|
+
at: number;
|
|
152
|
+
label: string;
|
|
153
|
+
}
|
|
154
|
+
type YScale = "linear" | "log";
|
|
155
|
+
//#endregion
|
|
156
|
+
//#region src/svg.d.ts
|
|
157
|
+
/** Point shapes: the second channel that keeps series distinct without colour. */
|
|
158
|
+
type MarkerShape = "circle" | "square" | "triangle" | "diamond";
|
|
159
|
+
//#endregion
|
|
135
160
|
//#region src/events.d.ts
|
|
136
161
|
/**
|
|
137
162
|
* `pass` is solid, `deadline` dashed, `died` ends in a cross and `event` is dotted. `release`, `steer`, `ruling` and
|
|
@@ -150,8 +175,12 @@ interface ChartMark {
|
|
|
150
175
|
/** `timeline` only: the lane the event belongs to. It is drawn on that lane instead of across every lane. */
|
|
151
176
|
lane?: string;
|
|
152
177
|
}
|
|
153
|
-
/**
|
|
154
|
-
|
|
178
|
+
/**
|
|
179
|
+
* `missing` is hatched: a span with no data is never drawn as zero. `blocked` is a system-wide wall, such as a quota
|
|
180
|
+
* window. `group` labels a run of positions in a header row above the data, such as one run's release tags, with a
|
|
181
|
+
* rule at each edge; a group may cover a single position (`from` equal to `to`).
|
|
182
|
+
*/
|
|
183
|
+
type BandKind = "after-pass" | "idle" | "missing" | "blocked" | "group";
|
|
155
184
|
interface ChartBand {
|
|
156
185
|
from: number;
|
|
157
186
|
to: number;
|
|
@@ -159,6 +188,54 @@ interface ChartBand {
|
|
|
159
188
|
kind: BandKind;
|
|
160
189
|
}
|
|
161
190
|
//#endregion
|
|
191
|
+
//#region src/points.d.ts
|
|
192
|
+
/** A status glyph beside a mark: `check` for a solve, `cross` for a failing candidate. */
|
|
193
|
+
type PointGlyph = "check" | "cross";
|
|
194
|
+
interface PointFields {
|
|
195
|
+
/**
|
|
196
|
+
* A recorded verdict: `pass` draws a filled mark (solved, contract held), `fail` an outline (not solved, contract
|
|
197
|
+
* failed), `unknown` a dashed outline (undecided). A verdict with a null value is drawn in the strip under the plot.
|
|
198
|
+
*/
|
|
199
|
+
verdict?: MarkVerdict;
|
|
200
|
+
/** How many recorded rows this mark stands for. Above 1 it carries a `×n` badge. */
|
|
201
|
+
count?: number;
|
|
202
|
+
/** Epoch milliseconds of the first and last recorded row, shown on hover and in the table. */
|
|
203
|
+
firstAt?: number;
|
|
204
|
+
lastAt?: number;
|
|
205
|
+
/** Whether the value can be compared with the goal: false is an outline with `*`, null (unknown) an outline with `?`. */
|
|
206
|
+
comparable?: boolean | null;
|
|
207
|
+
glyph?: PointGlyph;
|
|
208
|
+
/** This mark's shape, such as a diamond for a gate among circles for checks. Default: the series' shape. */
|
|
209
|
+
marker?: MarkerShape;
|
|
210
|
+
/** A short direct label beside the mark, such as `9/15`. */
|
|
211
|
+
label?: string;
|
|
212
|
+
}
|
|
213
|
+
//#endregion
|
|
214
|
+
//#region src/outcomes.d.ts
|
|
215
|
+
/**
|
|
216
|
+
* The fixed palettes every Discovery view shares: attempt outcomes (stack order) and check versions (checkers).
|
|
217
|
+
* The colours live once, as `--chart-outcome-*` and `--chart-checker-*` custom properties in `figure.css`, each a
|
|
218
|
+
* `light-dark()` pair chosen by the page's `color-scheme`. `node scripts/palette-check.mjs <validate_palette.js>`
|
|
219
|
+
* runs both palettes through the dataviz validator on the light surface and on #161616.
|
|
220
|
+
*/
|
|
221
|
+
/**
|
|
222
|
+
* How one recorded attempt ended. `ok` succeeded; every other outcome counts as failed. `lost` is a turn the
|
|
223
|
+
* platform lost without a kill (a sandbox that vanished), distinct from `oom`, a turn killed for memory.
|
|
224
|
+
*/
|
|
225
|
+
type TickOutcome = "ok" | "quota" | "lost" | "rate-limit" | "oom" | "refused" | "aborted" | "other";
|
|
226
|
+
/**
|
|
227
|
+
* Outcomes in stack order. Adjacent outcomes pass the colour-vision checks in both themes in this order, so a stacked
|
|
228
|
+
* bar keeps it; `aborted` and `other` share the neutral tone and always carry a label. An attempt still running is
|
|
229
|
+
* `open` and is drawn hatched, never as an outcome.
|
|
230
|
+
*/
|
|
231
|
+
declare const OUTCOME_ORDER: readonly TickOutcome[];
|
|
232
|
+
/** The CSS colour of each outcome, for a caller that paints its own marks (a legend, a stacked bar). */
|
|
233
|
+
declare const OUTCOME_COLORS: Readonly<Record<TickOutcome, string>>;
|
|
234
|
+
/** How many checkers have their own hue. Index 0 is the current checker; later indexes are older checkers. */
|
|
235
|
+
declare const CHECKER_HUES = 4;
|
|
236
|
+
/** The CSS colour of checker `index` (0 is current). Indexes past the fourth hue fold into the muted tone. */
|
|
237
|
+
declare function checkerColor(index: number): string;
|
|
238
|
+
//#endregion
|
|
162
239
|
//#region src/timeline.d.ts
|
|
163
240
|
/** Epoch milliseconds. `end: null` is an open span; it needs the figure's `now`. */
|
|
164
241
|
interface TimelineSpan {
|
|
@@ -167,8 +244,6 @@ interface TimelineSpan {
|
|
|
167
244
|
state: string;
|
|
168
245
|
note?: string;
|
|
169
246
|
}
|
|
170
|
-
/** How one recorded attempt ended. `ok` succeeded; every other outcome counts as failed. */
|
|
171
|
-
type TickOutcome = "ok" | "quota" | "rate-limit" | "oom" | "refused" | "aborted" | "other";
|
|
172
247
|
/** One recorded attempt on a lane, such as a driver turn, at the time it ended. `note` (an error line) shows on hover. */
|
|
173
248
|
interface TimelineTick {
|
|
174
249
|
at: number;
|
|
@@ -215,4 +290,4 @@ interface TimelineOptions {
|
|
|
215
290
|
}
|
|
216
291
|
declare function timeline(lanes: TimelineLane[], o: TimelineOptions): Figure | Refusal;
|
|
217
292
|
//#endregion
|
|
218
|
-
export {
|
|
293
|
+
export { IntervalMethod as A, BreakdownInput as C, Exclusion as D, Estimate as E, Tier as F, TierCounts as I, isRefusal as L, RateRow as M, Refusal as N, Figure as O, Setup as P, YTick as S, CostBasis as T, MarkVerdict as _, timeline as a, YScale as b, OUTCOME_ORDER as c, PointFields as d, PointGlyph as f, MarkKind as g, ChartMark as h, TimelineTick as i, MatrixCell as j, Interval as k, TickOutcome as l, ChartBand as m, TimelineOptions as n, CHECKER_HUES as o, BandKind as p, TimelineSpan as r, OUTCOME_COLORS as s, TimelineLane as t, checkerColor as u, MarkerShape as v, ComparisonRow as w, YTarget as x, XCategory as y };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tangle-network/charts",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.1",
|
|
4
4
|
"description": "Static SVG and HTML figures for benchmarks and operational timing. Draws from producer data and refuses what it cannot draw honestly.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|