@tangle-network/charts 0.8.0 → 0.9.0

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.
@@ -1,9 +1,5 @@
1
- import { S as Refusal, _ as Figure, a as TimelineTick, c as ChartBand, d as MarkVerdict, i as TimelineSpan, l as ChartMark, n as TimelineLane, r as TimelineOptions, s as BandKind, t as TickOutcome, u as MarkKind } from "../timeline-CCEJug7n.js";
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 };
@@ -1,4 +1,4 @@
1
- import { F as hatchPath, R as markerPath, l as markName, o as eventsGap, r as MARK_HEADS, t as timeline, u as isRefusal } from "../timeline-CCWFvLxg.js";
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
@@ -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
- /** Bands sit under the data; a missing band is hatched over a neutral wash. A band is clipped to `clip` when given. */
597
- function drawBands(bands, px, top, bottom, format, clip) {
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 x = px(from), w = px(to) - x, cls = `tgc-band tgc-band-${band.kind}`;
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/timeline.ts
769
+ //#region src/outcomes.ts
737
770
  /**
738
- * Lanes of recorded spans on one time axis, with recorded marks; an open span runs to the supplied `now`. Lanes can
739
- * form a tree (`parent`), carry attempt ticks coloured by outcome with ok and failed counts, and fold by subtree.
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 TICK_OUTCOMES = [
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 { usdTick as A, rect as B, rateDataGap as C, tierSummary as D, tierAtLeast as E, hatchPath as F, esc as G, text as H, hbar as I, plural as J, fitLines as K, line as L, MARKER_SHAPES as M, circle as N, tierTotal as O, hatch as P, markerPath as R, pts as S, rateOrder as T, titled as U, svgRoot as V, capitalize as W, textWidth as X, textBlock as Y, wrap as Z, intervalGap as _, drawMarks as a, pct as b, markLabelRows as c, METHOD_NAME as d, TIERS_BEST_FIRST as f, estimateNote as g, duration as h, drawBands as i, table as j, usd as k, markName as l, drawable as m, EVENTS_READ as n, eventsGap as o, costText as p, listJoin as q, MARK_HEADS as r, eventsTable as s, timeline as t, isRefusal as u, intervalName as v, rateIntervalGap as w, perPass as x, kn as y, polyline as z };
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
- /** `missing` is hatched: a span with no data is never drawn as zero. `blocked` is a system-wide wall, such as a quota window. */
154
- type BandKind = "after-pass" | "idle" | "missing" | "blocked";
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 { Setup as C, isRefusal as E, Refusal as S, TierCounts as T, Figure as _, TimelineTick as a, MatrixCell as b, ChartBand as c, MarkVerdict as d, BreakdownInput as f, Exclusion as g, Estimate as h, TimelineSpan as i, ChartMark as l, CostBasis as m, TimelineLane as n, timeline as o, ComparisonRow as p, TimelineOptions as r, BandKind as s, TickOutcome as t, MarkKind as u, Interval as v, Tier as w, RateRow as x, IntervalMethod as y };
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.8.0",
3
+ "version": "0.9.0",
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",