@xeonr/platform-ui 1.8.0 → 1.10.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.
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -1
- package/dist/index.js.map +1 -1
- package/dist/kit/ChartFrame.d.ts +86 -0
- package/dist/kit/ChartFrame.d.ts.map +1 -0
- package/dist/kit/ChartFrame.js +176 -0
- package/dist/kit/ChartFrame.js.map +1 -0
- package/dist/kit/ChartTypes.d.ts +160 -0
- package/dist/kit/ChartTypes.d.ts.map +1 -0
- package/dist/kit/ChartTypes.js +320 -0
- package/dist/kit/ChartTypes.js.map +1 -0
- package/dist/kit/Charts.d.ts +173 -65
- package/dist/kit/Charts.d.ts.map +1 -1
- package/dist/kit/Charts.js +664 -308
- package/dist/kit/Charts.js.map +1 -1
- package/dist/kit/FacetRail.d.ts +171 -0
- package/dist/kit/FacetRail.d.ts.map +1 -0
- package/dist/kit/FacetRail.js +296 -0
- package/dist/kit/FacetRail.js.map +1 -0
- package/dist/kit/Sparkline.d.ts +8 -1
- package/dist/kit/Sparkline.d.ts.map +1 -1
- package/dist/kit/Sparkline.js +6 -4
- package/dist/kit/Sparkline.js.map +1 -1
- package/dist/kit/chartScale.d.ts +78 -0
- package/dist/kit/chartScale.d.ts.map +1 -0
- package/dist/kit/chartScale.js +210 -0
- package/dist/kit/chartScale.js.map +1 -0
- package/dist/theme/tokens.d.ts +16 -0
- package/dist/theme/tokens.d.ts.map +1 -1
- package/dist/theme/tokens.js +49 -0
- package/dist/theme/tokens.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useLayoutEffect, useMemo, useRef, useState } from "react";
|
|
3
|
+
import styled from "styled-components";
|
|
4
|
+
import { Link } from "react-router-dom";
|
|
5
|
+
import { v } from "../theme/tokens.js";
|
|
6
|
+
import { fmtCount } from "./Facet.js";
|
|
7
|
+
import { Tooltip } from "./Tooltip.js";
|
|
8
|
+
import { Sparkline } from "./Sparkline.js";
|
|
9
|
+
import { LegendNote } from "./ChartFrame.js";
|
|
10
|
+
import { CHART_SIZES, TONE_COLOUR, niceTicks, percentileToken, spaced, timeDetail, timeTicks, useChartSize, } from "./chartScale.js";
|
|
11
|
+
// The chart types that are not a line over time (board 33): a value
|
|
12
|
+
// distribution, a ranked list, a heatmap, a single value and a state timeline.
|
|
13
|
+
// Each shares the anatomy — the frame's title row and states, the sizes, the
|
|
14
|
+
// ramp and the tones — and each has one job.
|
|
15
|
+
/** Measures an element's width for a chart drawn at its real size; 600 where there is no ResizeObserver. */
|
|
16
|
+
function useWidth(dep) {
|
|
17
|
+
const ref = useRef(null);
|
|
18
|
+
const [width, setWidth] = useState(600);
|
|
19
|
+
useLayoutEffect(() => {
|
|
20
|
+
const el = ref.current;
|
|
21
|
+
if (!el || typeof ResizeObserver === "undefined")
|
|
22
|
+
return;
|
|
23
|
+
const measure = () => { const w = el.getBoundingClientRect().width; if (w > 0)
|
|
24
|
+
setWidth(Math.max(120, Math.round(w))); };
|
|
25
|
+
measure();
|
|
26
|
+
const ro = new ResizeObserver(measure);
|
|
27
|
+
ro.observe(el);
|
|
28
|
+
return () => ro.disconnect();
|
|
29
|
+
}, [dep]);
|
|
30
|
+
return [ref, width];
|
|
31
|
+
}
|
|
32
|
+
const Box = styled.div `position: relative; min-width: 0;`;
|
|
33
|
+
const Svg = styled.svg `
|
|
34
|
+
display: block; width: 100%; overflow: visible; user-select: none;
|
|
35
|
+
text { font-family: ${v.mono}; font-variant-numeric: tabular-nums; }
|
|
36
|
+
&:focus { outline: none; }
|
|
37
|
+
&:focus-visible { outline: 2px solid ${v.brand55}; outline-offset: 2px; border-radius: 4px; }
|
|
38
|
+
`;
|
|
39
|
+
const Empty = styled.div `
|
|
40
|
+
height: ${(p) => p.$h}px; display: grid; place-items: center; color: ${v.faint}; font-size: 12px;
|
|
41
|
+
`;
|
|
42
|
+
const Readout = styled.div `
|
|
43
|
+
position: absolute; top: 4px; pointer-events: none; z-index: ${v.zPop};
|
|
44
|
+
padding: 5px 8px; border: 1px solid ${v.line2}; border-radius: 8px; background: ${v.surface2}; box-shadow: ${v.elev};
|
|
45
|
+
font-family: ${v.mono}; font-size: 11px; color: ${v.text}; white-space: nowrap;
|
|
46
|
+
.d { color: ${v.faint}; }
|
|
47
|
+
`;
|
|
48
|
+
const Notes = styled.div `display: flex; flex-wrap: wrap; gap: 2px 4px; padding-top: 4px;`;
|
|
49
|
+
/**
|
|
50
|
+
* DistributionChart: a histogram of values (latency over a window) with the
|
|
51
|
+
* percentiles marked — p50 light to p99 hot. The point of this shape over
|
|
52
|
+
* percentile lines is the bimodal case: two humps, a fast path and a slow one,
|
|
53
|
+
* that a p99 line renders as one number halfway between two behaviours nothing
|
|
54
|
+
* actually exhibits.
|
|
55
|
+
*
|
|
56
|
+
* Buckets arrive pre-binned and are drawn one bar each, so exponential buckets
|
|
57
|
+
* give a log axis without saying so; the value ticks (1 · 3 · 10 …) and the
|
|
58
|
+
* percentile lines are placed within their bucket on the same scale. A click
|
|
59
|
+
* on a bar is `onBucketClick` (its traces); a drag is `onSelectRange`.
|
|
60
|
+
*/
|
|
61
|
+
export function DistributionChart({ buckets, percentiles = [], formatValue = (n) => String(Number(n.toPrecision(3))), formatCount = fmtCount, size: sizeProp, height, label = "Distribution", empty = "No observations in this window.", onBucketClick, onSelectRange, legend, testId, }) {
|
|
62
|
+
const size = useChartSize(sizeProp);
|
|
63
|
+
const spec = CHART_SIZES[size];
|
|
64
|
+
const H = height ?? spec.height;
|
|
65
|
+
const axes = spec.yTicks > 0;
|
|
66
|
+
const [ref, width] = useWidth(buckets.length > 0);
|
|
67
|
+
const [hover, setHover] = useState(null);
|
|
68
|
+
const [drag, setDrag] = useState(null);
|
|
69
|
+
const downX = useRef(null);
|
|
70
|
+
if (buckets.length === 0)
|
|
71
|
+
return _jsx(Box, { ref: ref, "data-testid": testId, children: _jsx(Empty, { "$h": H, children: empty }) });
|
|
72
|
+
const n = buckets.length;
|
|
73
|
+
const maxCount = Math.max(1, ...buckets.map((b) => b.count));
|
|
74
|
+
const yt = axes ? niceTicks(0, maxCount, Math.max(2, spec.yTicks - 1)) : { ticks: [0, maxCount], max: maxCount, min: 0 };
|
|
75
|
+
const yLabels = yt.ticks.map((t) => formatCount(t));
|
|
76
|
+
const padL = axes ? Math.max(26, Math.ceil(Math.max(...yLabels.map((s) => s.length)) * 6.2) + 10) : 0;
|
|
77
|
+
const padR = axes ? 10 : 0;
|
|
78
|
+
const padT = axes ? 16 : 2;
|
|
79
|
+
const padB = axes ? 20 : 2;
|
|
80
|
+
const plotW = Math.max(10, width - padL - padR);
|
|
81
|
+
const plotH = Math.max(10, H - padT - padB);
|
|
82
|
+
const bottom = padT + plotH;
|
|
83
|
+
const bw = plotW / n;
|
|
84
|
+
const y = (c) => bottom - (c / yt.max) * plotH;
|
|
85
|
+
// A value's place on the bucket axis: its bucket, then within it (log when both bounds are positive).
|
|
86
|
+
const pos = (val) => {
|
|
87
|
+
let i = buckets.findIndex((b) => val <= b.upper);
|
|
88
|
+
if (i < 0)
|
|
89
|
+
i = n - 1;
|
|
90
|
+
const b = buckets[i];
|
|
91
|
+
const within = b.upper <= b.lower ? 0
|
|
92
|
+
: b.lower > 0 ? (Math.log(Math.max(val, b.lower)) - Math.log(b.lower)) / (Math.log(b.upper) - Math.log(b.lower))
|
|
93
|
+
: (val - b.lower) / (b.upper - b.lower);
|
|
94
|
+
return padL + (i + Math.min(1, Math.max(0, within))) * bw;
|
|
95
|
+
};
|
|
96
|
+
const valueAt = (px) => {
|
|
97
|
+
const i = Math.min(n - 1, Math.max(0, Math.floor((px - padL) / bw)));
|
|
98
|
+
const b = buckets[i];
|
|
99
|
+
const within = Math.min(1, Math.max(0, (px - padL) / bw - i));
|
|
100
|
+
return b.lower > 0 ? Math.exp(Math.log(b.lower) + within * (Math.log(b.upper) - Math.log(b.lower))) : b.lower + within * (b.upper - b.lower);
|
|
101
|
+
};
|
|
102
|
+
const lo = buckets[0].lower;
|
|
103
|
+
const hi = buckets[n - 1].upper;
|
|
104
|
+
// Ticks at 1 · 3 × 10ⁿ on a positive axis, spaced at least 46 px apart.
|
|
105
|
+
const xTicks = [];
|
|
106
|
+
if (axes) {
|
|
107
|
+
if (lo > 0) {
|
|
108
|
+
for (let e = Math.floor(Math.log10(lo)); e <= Math.ceil(Math.log10(hi)); e++) {
|
|
109
|
+
for (const m of [1, 3]) {
|
|
110
|
+
const t = m * 10 ** e;
|
|
111
|
+
if (t >= lo && t <= hi)
|
|
112
|
+
xTicks.push(t);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
else
|
|
117
|
+
xTicks.push(...niceTicks(lo, hi, 5).ticks.filter((t) => t >= lo && t <= hi));
|
|
118
|
+
}
|
|
119
|
+
const tickPx = xTicks.map((t) => pos(t));
|
|
120
|
+
const keepTick = spaced(tickPx, 46);
|
|
121
|
+
const xMarks = xTicks.map((t, i) => ({ t, px: tickPx[i] })).filter((_m, i) => keepTick[i]);
|
|
122
|
+
const byValue = [...percentiles].sort((a, b) => a.value - b.value);
|
|
123
|
+
const markPx = byValue.map((p) => pos(p.value));
|
|
124
|
+
const keepMark = spaced(markPx, 40);
|
|
125
|
+
const marks = byValue.map((p, i) => ({ ...p, px: markPx[i], show: keepMark[i] }));
|
|
126
|
+
const toLocal = (clientX, el) => {
|
|
127
|
+
const r = el.getBoundingClientRect();
|
|
128
|
+
return ((clientX - r.left) / Math.max(1, r.width)) * width;
|
|
129
|
+
};
|
|
130
|
+
const idxOf = (px) => Math.min(n - 1, Math.max(0, Math.floor((px - padL) / bw)));
|
|
131
|
+
const interactive = !!onBucketClick || !!onSelectRange;
|
|
132
|
+
const handlers = {
|
|
133
|
+
onPointerMove: (e) => {
|
|
134
|
+
const px = toLocal(e.clientX, e.currentTarget);
|
|
135
|
+
setHover(px >= padL && px <= padL + plotW ? idxOf(px) : null);
|
|
136
|
+
if (drag)
|
|
137
|
+
setDrag({ from: drag.from, to: px });
|
|
138
|
+
},
|
|
139
|
+
onPointerLeave: () => { setHover(null); setDrag(null); },
|
|
140
|
+
onPointerDown: (e) => {
|
|
141
|
+
const px = toLocal(e.clientX, e.currentTarget);
|
|
142
|
+
downX.current = px;
|
|
143
|
+
if (onSelectRange)
|
|
144
|
+
setDrag({ from: px, to: px });
|
|
145
|
+
},
|
|
146
|
+
onPointerUp: (e) => {
|
|
147
|
+
const px = toLocal(e.clientX, e.currentTarget);
|
|
148
|
+
const start = downX.current;
|
|
149
|
+
downX.current = null;
|
|
150
|
+
setDrag(null);
|
|
151
|
+
if (onSelectRange && start !== null && Math.abs(px - start) > 6) {
|
|
152
|
+
const [a, b] = [start, px].sort((p, q) => p - q);
|
|
153
|
+
onSelectRange(valueAt(a), valueAt(b));
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
if (onBucketClick && start !== null) {
|
|
157
|
+
const i = idxOf(px);
|
|
158
|
+
onBucketClick(buckets[i], i);
|
|
159
|
+
}
|
|
160
|
+
},
|
|
161
|
+
};
|
|
162
|
+
const hb = hover !== null ? buckets[hover] : undefined;
|
|
163
|
+
const showLegend = (legend ?? spec.legend) && marks.length > 0;
|
|
164
|
+
return (_jsxs(Box, { "data-testid": testId, children: [_jsxs("div", { ref: ref, style: { position: "relative" }, children: [_jsxs(Svg, { width: "100%", height: H, viewBox: `0 0 ${width} ${H}`, preserveAspectRatio: "none", role: "img", "aria-label": label, style: { cursor: interactive ? "pointer" : "default" }, ...handlers, children: [axes ? yt.ticks.map((t, i) => (_jsxs("g", { children: [t > 0 ? _jsx("line", { x1: padL, x2: padL + plotW, y1: y(t), y2: y(t), stroke: v.line }) : null, _jsx("text", { x: padL - 6, y: y(t) + 3.5, textAnchor: "end", fontSize: 10, fill: v.faint, children: yLabels[i] })] }, `y${t}`))) : null, buckets.map((b, i) => {
|
|
165
|
+
const h = b.count > 0 ? Math.max(1.5, bottom - y(b.count)) : 0;
|
|
166
|
+
return (_jsx("rect", { x: padL + i * bw + 0.5, y: bottom - h, width: Math.max(0.5, bw - 1), height: h, fill: v.chartInfo, opacity: hover === i ? 1 : 0.7, "data-testid": testId ? `${testId}-bar` : undefined, children: _jsx("title", { children: `${formatValue(b.lower)} – ${formatValue(b.upper)}: ${formatCount(b.count)}` }) }, i));
|
|
167
|
+
}), axes ? _jsx("line", { x1: padL, x2: padL + plotW, y1: bottom, y2: bottom, stroke: v.line2 }) : null, xMarks.map((m) => (_jsx("text", { x: m.px, y: H - 5, fontSize: 10, fill: v.faint, textAnchor: m.px - padL < 16 ? "start" : "middle", children: formatValue(m.t) }, m.t))), marks.map((m) => (_jsxs("g", { children: [_jsx("line", { x1: m.px, x2: m.px, y1: padT, y2: bottom, stroke: percentileToken(m.p), strokeDasharray: "4 3" }), m.show && axes ? _jsx("text", { x: m.px + 3, y: padT - 4, fontSize: 10, fill: percentileToken(m.p), children: `p${m.p} ${formatValue(m.value)}` }) : null] }, m.p))), drag && Math.abs(drag.to - drag.from) > 2 ? (_jsx("rect", { x: Math.min(drag.from, drag.to), width: Math.abs(drag.to - drag.from), y: padT, height: plotH, fill: v.brand16, stroke: v.brand55 })) : null] }), hb && !drag && size !== "s" ? (_jsxs(Readout, { style: hover > n / 2 ? { right: width - (padL + hover * bw) + 6 } : { left: padL + (hover + 1) * bw + 6 }, children: [formatValue(hb.lower), " \u2013 ", formatValue(hb.upper), " ", _jsx("span", { className: "d", children: "\u00B7" }), " ", formatCount(hb.count), onBucketClick ? _jsx("span", { className: "d", children: " \u00B7 click for its traces" }) : null] })) : null] }), showLegend ? (_jsx(Notes, { "aria-label": "Percentiles", children: marks.map((m) => _jsx(LegendNote, { colour: percentileToken(m.p), dashed: true, children: `p${m.p} ${formatValue(m.value)}` }, m.p)) })) : null] }));
|
|
168
|
+
}
|
|
169
|
+
const Rows = styled.ol `list-style: none; margin: 0; padding: 0; display: grid; gap: 2px; min-width: 0;`;
|
|
170
|
+
const RowItem = styled.li `min-width: 0;`;
|
|
171
|
+
const RowBody = styled.div `
|
|
172
|
+
position: relative;
|
|
173
|
+
display: grid;
|
|
174
|
+
grid-template-columns: minmax(0, 1fr) auto;
|
|
175
|
+
align-items: center;
|
|
176
|
+
gap: 10px;
|
|
177
|
+
min-height: 24px;
|
|
178
|
+
padding: 3px 8px;
|
|
179
|
+
border-radius: 6px;
|
|
180
|
+
color: ${v.text};
|
|
181
|
+
text-decoration: none;
|
|
182
|
+
font-size: 12px;
|
|
183
|
+
cursor: ${(p) => (p.$link ? "pointer" : "default")};
|
|
184
|
+
.bar { position: absolute; inset: 2px auto 2px 0; border-radius: 5px; opacity: 0.18; pointer-events: none; }
|
|
185
|
+
.l { position: relative; font-family: ${v.mono}; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
186
|
+
.v { position: relative; font-family: ${v.mono}; font-variant-numeric: tabular-nums; color: ${v.text}; font-weight: 600; }
|
|
187
|
+
&:hover { background: ${(p) => (p.$link ? v.hover : "transparent")}; }
|
|
188
|
+
&:focus-visible { outline: none; box-shadow: ${v.ring}; }
|
|
189
|
+
`;
|
|
190
|
+
const BUTTON_RESET = { width: "100%", border: 0, background: "none", font: "inherit", fontSize: 12, textAlign: "left" };
|
|
191
|
+
/**
|
|
192
|
+
* TopList: ranked horizontal bars with the value — p99 by endpoint, errors by
|
|
193
|
+
* route. Rows are sorted by value, highest first, and cut at `max`; a row with
|
|
194
|
+
* `to` or `onSelect` opens the thing it ranks.
|
|
195
|
+
*/
|
|
196
|
+
export function TopList({ rows, formatValue = fmtCount, max = 10, label = "Top list", empty = "Nothing to rank in this window.", testId }) {
|
|
197
|
+
const sorted = useMemo(() => [...rows].sort((a, b) => b.value - a.value).slice(0, max), [rows, max]);
|
|
198
|
+
if (sorted.length === 0)
|
|
199
|
+
return _jsx(Empty, { "$h": 80, "data-testid": testId, children: empty });
|
|
200
|
+
const top = Math.max(...sorted.map((r) => Math.abs(r.value)), 1e-12);
|
|
201
|
+
return (_jsx(Rows, { "aria-label": label, "data-testid": testId, children: sorted.map((r) => {
|
|
202
|
+
const inner = (_jsxs(_Fragment, { children: [_jsx("span", { className: "bar", style: { width: `${Math.max(1, (Math.abs(r.value) / top) * 100)}%`, background: r.colour ?? (r.tone ? TONE_COLOUR[r.tone] : v.series1) } }), _jsx("span", { className: "l", title: r.title ?? (typeof r.label === "string" ? r.label : undefined), children: r.label }), _jsx("span", { className: "v", children: r.display ?? formatValue(r.value) })] }));
|
|
203
|
+
return (_jsx(RowItem, { children: r.to ? _jsx(RowBody, { as: Link, to: r.to, "$link": true, children: inner })
|
|
204
|
+
: r.onSelect ? _jsx(RowBody, { as: "button", type: "button", "$link": true, onClick: r.onSelect, style: BUTTON_RESET, children: inner })
|
|
205
|
+
: _jsx(RowBody, { "$link": false, children: inner }) }, r.key));
|
|
206
|
+
}) }));
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Heatmap: value buckets × time, intensity = count — the shape of a latency
|
|
210
|
+
* tail without a line per percentile. `bounds` are the value buckets' edges,
|
|
211
|
+
* bottom up (one more than each column's counts). Intensity is on a log scale
|
|
212
|
+
* so one busy cell does not wash out the rest.
|
|
213
|
+
*/
|
|
214
|
+
export function Heatmap({ columns, bounds, formatValue = (n) => String(Number(n.toPrecision(3))), formatTime, size: sizeProp, height, label = "Heatmap", empty = "No samples in range", onCellClick, testId }) {
|
|
215
|
+
const size = useChartSize(sizeProp);
|
|
216
|
+
const spec = CHART_SIZES[size];
|
|
217
|
+
const H = height ?? spec.height;
|
|
218
|
+
const axes = spec.yTicks > 0;
|
|
219
|
+
const [ref, width] = useWidth(columns.length > 0);
|
|
220
|
+
const [hover, setHover] = useState(null);
|
|
221
|
+
const sorted = useMemo(() => [...columns].sort((a, b) => a.t - b.t), [columns]);
|
|
222
|
+
if (sorted.length === 0 || bounds.length < 2)
|
|
223
|
+
return _jsx(Box, { ref: ref, "data-testid": testId, children: _jsx(Empty, { "$h": H, children: empty }) });
|
|
224
|
+
const rowsN = bounds.length - 1;
|
|
225
|
+
const step = sorted.length > 1 ? sorted[1].t - sorted[0].t : 60_000;
|
|
226
|
+
const from = sorted[0].t;
|
|
227
|
+
const to = sorted[sorted.length - 1].t + step;
|
|
228
|
+
const maxC = Math.max(1, ...sorted.flatMap((c) => c.counts));
|
|
229
|
+
const yLabelsAll = bounds.map((b) => formatValue(b));
|
|
230
|
+
const padL = axes ? Math.max(30, Math.ceil(Math.max(...yLabelsAll.map((s) => s.length)) * 6.2) + 10) : 0;
|
|
231
|
+
const padR = axes ? 10 : 0;
|
|
232
|
+
const padT = axes ? 6 : 1;
|
|
233
|
+
const padB = axes ? 20 : 1;
|
|
234
|
+
const plotW = Math.max(10, width - padL - padR);
|
|
235
|
+
const plotH = Math.max(10, H - padT - padB);
|
|
236
|
+
const cw = plotW / sorted.length;
|
|
237
|
+
const rh = plotH / rowsN;
|
|
238
|
+
const x = (t) => padL + ((t - from) / (to - from)) * plotW;
|
|
239
|
+
const intensity = (c) => (c <= 0 ? 0 : 0.12 + 0.88 * (Math.log1p(c) / Math.log1p(maxC)));
|
|
240
|
+
// Value labels at about four bounds, bottom to top.
|
|
241
|
+
const every = Math.max(1, Math.ceil(rowsN / 4));
|
|
242
|
+
const xMarks = axes ? timeTicks(from, to, Math.min(spec.xTicks, Math.max(2, Math.floor(plotW / 70))), formatTime) : [];
|
|
243
|
+
const detail = formatTime ?? timeDetail(step);
|
|
244
|
+
const cell = hover ? { col: sorted[hover.c], r: hover.r } : null;
|
|
245
|
+
return (_jsx(Box, { "data-testid": testId, children: _jsxs("div", { ref: ref, style: { position: "relative" }, children: [_jsxs(Svg, { width: "100%", height: H, viewBox: `0 0 ${width} ${H}`, preserveAspectRatio: "none", role: "img", "aria-label": label, onPointerMove: (e) => {
|
|
246
|
+
const r = e.currentTarget.getBoundingClientRect();
|
|
247
|
+
const px = ((e.clientX - r.left) / Math.max(1, r.width)) * width;
|
|
248
|
+
const py = ((e.clientY - r.top) / Math.max(1, r.height)) * H;
|
|
249
|
+
const c = Math.floor((px - padL) / cw);
|
|
250
|
+
const row = rowsN - 1 - Math.floor((py - padT) / rh);
|
|
251
|
+
setHover(c >= 0 && c < sorted.length && row >= 0 && row < rowsN ? { c, r: row } : null);
|
|
252
|
+
}, onPointerLeave: () => setHover(null), onClick: onCellClick ? () => {
|
|
253
|
+
if (!cell)
|
|
254
|
+
return;
|
|
255
|
+
onCellClick({ t: cell.col.t, lower: bounds[cell.r], upper: bounds[cell.r + 1], count: cell.col.counts[cell.r] ?? 0 });
|
|
256
|
+
} : undefined, style: { cursor: onCellClick ? "pointer" : "default" }, children: [sorted.map((col, ci) => col.counts.map((c, ri) => {
|
|
257
|
+
const a = intensity(c);
|
|
258
|
+
if (a === 0)
|
|
259
|
+
return null;
|
|
260
|
+
return _jsx("rect", { x: padL + ci * cw, y: padT + (rowsN - 1 - ri) * rh, width: Math.max(0.5, cw - 0.5), height: Math.max(0.5, rh - 0.5), fill: v.pct99, opacity: a }, `${ci}-${ri}`);
|
|
261
|
+
})), axes ? bounds.map((_b, i) => (i % every === 0 ? (_jsx("text", { x: padL - 6, y: padT + (rowsN - i) * rh + 3.5, textAnchor: "end", fontSize: 10, fill: v.faint, children: yLabelsAll[i] }, `y${i}`)) : null)) : null, axes ? _jsx("line", { x1: padL, x2: padL + plotW, y1: padT + plotH, y2: padT + plotH, stroke: v.line2 }) : null, xMarks.map((tk, i) => (_jsx("text", { x: x(tk.t), y: H - 5, fontSize: 10, fill: v.faint, opacity: tk.dim ? 0.6 : 1, textAnchor: "middle", children: tk.label }, `x${i}`))), hover ? _jsx("rect", { x: padL + hover.c * cw, y: padT + (rowsN - 1 - hover.r) * rh, width: cw, height: rh, fill: "none", stroke: v.text, strokeWidth: 1 }) : null] }), cell && size !== "s" ? (_jsxs(Readout, { style: hover.c > sorted.length / 2 ? { right: width - (padL + hover.c * cw) + 6 } : { left: padL + (hover.c + 1) * cw + 6 }, children: [detail(cell.col.t), " ", _jsx("span", { className: "d", children: "\u00B7" }), " ", formatValue(bounds[cell.r]), " \u2013 ", formatValue(bounds[cell.r + 1]), " ", _jsx("span", { className: "d", children: "\u00B7" }), " ", fmtCount(cell.col.counts[cell.r] ?? 0)] })) : null] }) }));
|
|
262
|
+
}
|
|
263
|
+
// ---------------------------------------------------------------------------
|
|
264
|
+
// SingleValue
|
|
265
|
+
// ---------------------------------------------------------------------------
|
|
266
|
+
const SV = styled.div `
|
|
267
|
+
display: grid;
|
|
268
|
+
gap: 4px;
|
|
269
|
+
min-width: 0;
|
|
270
|
+
align-content: ${(p) => (p.$size === "s" ? "start" : "center")};
|
|
271
|
+
min-height: ${(p) => (p.$size === "s" ? 0 : CHART_SIZES[p.$size].height * 0.6)}px;
|
|
272
|
+
.num {
|
|
273
|
+
font-size: ${(p) => (p.$size === "s" ? 20 : p.$size === "m" ? 32 : 44)}px;
|
|
274
|
+
font-weight: 650; letter-spacing: -0.02em; color: ${v.text}; line-height: 1.1;
|
|
275
|
+
font-variant-numeric: tabular-nums; white-space: nowrap;
|
|
276
|
+
}
|
|
277
|
+
.num .u { font-size: 0.5em; font-weight: 500; color: ${v.muted}; margin-left: 3px; letter-spacing: 0; }
|
|
278
|
+
.sub { font-size: 11.5px; color: ${v.faint}; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
|
279
|
+
.d { font-variant-numeric: tabular-nums; }
|
|
280
|
+
.d.ok { color: ${v.chartOk}; } .d.warn { color: ${v.chartWarn}; } .d.crit { color: ${v.chartCrit}; }
|
|
281
|
+
`;
|
|
282
|
+
/**
|
|
283
|
+
* SingleValue: one number, its delta and an S sparkline — the stat tile's
|
|
284
|
+
* chart form ("98.4 % · availability · 30 d · ↑ 0.3 pt vs prior"). At `s` it
|
|
285
|
+
* is a tile's body; at M and up it fills a widget cell.
|
|
286
|
+
*/
|
|
287
|
+
export function SingleValue({ value, unit, label, delta, points, tone, size: sizeProp, testId }) {
|
|
288
|
+
const size = useChartSize(sizeProp);
|
|
289
|
+
const [ref, width] = useWidth(null);
|
|
290
|
+
const arrow = delta?.direction === "up" ? "↑ " : delta?.direction === "down" ? "↓ " : delta?.direction === "flat" ? "→ " : "";
|
|
291
|
+
return (_jsxs(SV, { "$size": size, "data-testid": testId, ref: ref, children: [_jsxs("span", { className: "num", style: tone ? { color: TONE_COLOUR[tone] } : undefined, children: [value, unit !== undefined ? _jsx("span", { className: "u", children: unit }) : null] }), label !== undefined || delta ? (_jsxs("span", { className: "sub", children: [label, label !== undefined && delta ? " · " : null, delta ? _jsxs("span", { className: `d ${delta.tone ?? ""}`, children: [arrow, delta.text] }) : null] })) : null, points && points.length > 1 ? (_jsx(Sparkline, { points: points, width: Math.max(60, width), height: size === "s" ? 24 : 32, tone: tone, lastDot: true, zeroBased: false })) : null] }));
|
|
292
|
+
}
|
|
293
|
+
const Track = styled.div `
|
|
294
|
+
display: flex;
|
|
295
|
+
height: ${(p) => p.$h}px;
|
|
296
|
+
width: ${(p) => (p.$w ? `${p.$w}px` : "100%")};
|
|
297
|
+
border-radius: 3px;
|
|
298
|
+
overflow: hidden;
|
|
299
|
+
background: ${v.field};
|
|
300
|
+
`;
|
|
301
|
+
const Seg = styled.div `min-width: 1px; flex: 1;`;
|
|
302
|
+
const Ticks = styled.div `
|
|
303
|
+
position: relative; height: 16px; margin-top: 3px;
|
|
304
|
+
font-family: ${v.mono}; font-size: 10px; color: ${v.faint};
|
|
305
|
+
span { position: absolute; transform: translateX(-50%); white-space: nowrap; }
|
|
306
|
+
span.dim { opacity: 0.6; }
|
|
307
|
+
`;
|
|
308
|
+
/**
|
|
309
|
+
* StateTimeline: a monitor's state (ok · warn · alert · no data) over a
|
|
310
|
+
* window, as proportional segments — the band under an alert chart and in
|
|
311
|
+
* monitor rows. Each segment's tooltip says what it was and when. `axis`
|
|
312
|
+
* draws the time ticks under it (at L, under a chart it does not sit beside).
|
|
313
|
+
*/
|
|
314
|
+
export function StateTimeline({ segments, range, height = 10, width, label = "State over time", axis = false, formatTime, testId = "state-timeline" }) {
|
|
315
|
+
const span = Math.max(1, range.to - range.from);
|
|
316
|
+
const detail = formatTime ?? timeDetail(60_000);
|
|
317
|
+
const ticks = axis ? timeTicks(range.from, range.to, 6, formatTime) : [];
|
|
318
|
+
return (_jsxs("div", { style: { minWidth: 0, width: width ? `${width}px` : undefined }, children: [_jsx(Track, { "$h": height, "$w": width, role: "img", "aria-label": label, "data-testid": testId, children: segments.map((s, i) => (_jsx(Tooltip, { label: s.label ?? `${s.state} · ${detail(s.from)} → ${detail(s.to)}`, style: { display: "flex", width: `${(Math.max(0, Math.min(s.to, range.to) - Math.max(s.from, range.from)) / span) * 100}%` }, children: _jsx(Seg, { style: { background: s.colour ?? TONE_COLOUR[s.tone ?? "mut"] }, "data-state": s.state }) }, i))) }), axis ? (_jsx(Ticks, { "aria-hidden": true, children: ticks.map((t) => _jsx("span", { className: t.dim ? "dim" : undefined, style: { left: `${((t.t - range.from) / span) * 100}%` }, children: t.label }, t.t)) })) : null] }));
|
|
319
|
+
}
|
|
320
|
+
//# sourceMappingURL=ChartTypes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChartTypes.js","sourceRoot":"","sources":["../../src/kit/ChartTypes.tsx"],"names":[],"mappings":"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"}
|