@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.
@@ -0,0 +1,296 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useEffect, useMemo, useState } from "react";
3
+ import styled from "styled-components";
4
+ import { v } from "../theme/tokens.js";
5
+ import { fmtCount, fmtShare } from "./Facet.js";
6
+ import { Disclosure, DisclosureGroup } from "./Blocks.js";
7
+ import { AppButton, IconButton } from "./Button.js";
8
+ import { Drawer } from "./Drawer.js";
9
+ import { Input } from "./Form.js";
10
+ import { Icon } from "./Icon.js";
11
+ import { Menu, MenuDivider, MenuItem } from "./Menu.js";
12
+ import { ConfirmDialog } from "./Modal.js";
13
+ import { MicroLabel } from "./Panel.js";
14
+ import { Spinner } from "./Skeleton.js";
15
+ import { Hint, Mono } from "./Text.js";
16
+ const Rail = styled.div `
17
+ display: flex;
18
+ flex-direction: column;
19
+ height: 100%;
20
+ min-height: 0;
21
+ min-width: 0;
22
+ overflow: hidden;
23
+ `;
24
+ const RailHead = styled.div `
25
+ flex: none;
26
+ display: flex;
27
+ align-items: center;
28
+ gap: 8px;
29
+ padding: 10px 12px 6px;
30
+ `;
31
+ const RailBody = styled.div `
32
+ flex: 1 1 auto;
33
+ min-height: 0;
34
+ overflow-y: auto;
35
+ padding-bottom: 8px;
36
+ `;
37
+ const Foot = styled.div `
38
+ padding: 8px 12px;
39
+ `;
40
+ function activeOf(f) {
41
+ return f.selected.length + f.excluded.length;
42
+ }
43
+ /** The disclosure's meta: "(n)" idle, else "k selected · m excluded". */
44
+ export function facetMeta(f) {
45
+ const active = activeOf(f);
46
+ if (active === 0)
47
+ return `(${f.values.length})`;
48
+ return [
49
+ f.selected.length > 0 && `${f.selected.length} selected`,
50
+ f.excluded.length > 0 && `${f.excluded.length} excluded`,
51
+ ]
52
+ .filter(Boolean)
53
+ .join(" · ");
54
+ }
55
+ function defaultConfirm(f) {
56
+ return activeOf(f) > 0
57
+ ? "The facet leaves the rail; its filters stay in force. Bring it back with “add facet”."
58
+ : "The facet leaves the rail. Bring it back with “add facet”.";
59
+ }
60
+ /**
61
+ * FacetRail: the facets of a list, each a disclosure over its values.
62
+ *
63
+ * Each value reads its state from the host — selected, excluded or neither —
64
+ * and a click toggles it. Hovering a value offers **only** and **exclude**;
65
+ * the facet's kebab clears its selection, pins it to the top or hides it.
66
+ * Hiding is the one destructive action, so it asks first: the old header ×
67
+ * did it silently, and read as "clear".
68
+ *
69
+ * The rail fills its column and scrolls its own values; the host decides the
70
+ * column (a `FacetedListLayout` or a workspace pane) and, on a phone, puts
71
+ * it in a `Drawer`.
72
+ */
73
+ export function FacetRail({ facets, onToggle, onOnly, onExclude, onUnexclude, onClear, onPin, onHide, onAdd, onClearAll, title = "Facets", countsUnit, loading, error, defaultOpen, shown = 30, searchFrom = 10, labelOf, confirmHide = defaultConfirm, extra, className, style, }) {
74
+ const [hiding, setHiding] = useState(null);
75
+ const anyActive = facets.some((f) => activeOf(f) > 0);
76
+ const hide = (f) => {
77
+ if (!onHide)
78
+ return;
79
+ if (confirmHide(f) === null)
80
+ onHide(f.key);
81
+ else
82
+ setHiding(f);
83
+ };
84
+ return (_jsxs(Rail, { className: className, style: style, "data-testid": "facet-rail", children: [_jsxs(RailHead, { children: [_jsx(MicroLabel, { children: title }), countsUnit ? (_jsxs(Hint, { as: "span", title: `The counts are ${countsUnit}, not rows of the list`, children: ["\u00B7 counts ", countsUnit] })) : null, loading ? _jsx(Spinner, { "$size": 12 }) : null, onClearAll && anyActive ? (_jsx(IconButton, { "$size": 18, "aria-label": "clear every facet", style: { marginLeft: "auto" }, onClick: onClearAll, children: _jsx(Icon, { name: "close", size: 11 }) })) : null] }), error ? _jsx(Hint, { "$tone": "crit", style: { padding: "0 12px 6px" }, children: error }) : null, _jsxs(RailBody, { children: [_jsx(DisclosureGroup, { children: facets.map((facet, index) => {
85
+ const active = activeOf(facet);
86
+ const open = active > 0 || (facet.defaultOpen ?? defaultOpen?.(facet.key) ?? false);
87
+ return (_jsx(Disclosure, { variant: "flush", defaultOpen: open, summary: _jsx(Mono, { "$size": 11, "$truncate": true, title: facet.key, children: facet.label ?? facet.key }), meta: _jsx("span", { "data-testid": `facet-count-${facet.key}`, children: facetMeta(facet) }), actions: _jsxs(Menu, { width: 190, trigger: () => (_jsx(IconButton, { "$size": 18, "aria-label": `facet menu ${facet.key}`, children: _jsx(Icon, { name: "more", size: 11 }) })), children: [_jsx(MenuItem, { icon: "close", disabled: active === 0, onClick: () => onClear(facet.key), children: "clear selection" }), onPin ? (_jsx(MenuItem, { icon: "pin", disabled: index === 0, onClick: () => onPin(facet.key), children: "pin to top" })) : null, onHide ? (_jsxs(_Fragment, { children: [_jsx(MenuDivider, {}), _jsx(MenuItem, { icon: "delete", danger: true, onClick: () => hide(facet), children: "hide facet" })] })) : null] }), children: _jsx(FacetValueList, { facetKey: facet.key, values: facet.values, selected: facet.selected, excluded: facet.excluded, loading: !!facet.loading, shown: shown, searchFrom: searchFrom, labelOf: labelOf ? (value) => labelOf(facet.key, value) : undefined, onToggle: (value) => onToggle(facet.key, value), onOnly: (value) => onOnly(facet.key, value), onExclude: (value) => onExclude(facet.key, value), onUnexclude: (value) => onUnexclude(facet.key, value) }) }, facet.key));
88
+ }) }), extra, onAdd ? (_jsx(Foot, { children: _jsx(AppButton, { size: "xs", variant: "quiet", icon: "add", fullWidth: true, onClick: onAdd, children: "add facet" }) })) : null] }), hiding && onHide ? (_jsx(ConfirmDialog, { title: `Hide ${typeof hiding.label === "string" ? hiding.label : hiding.key}?`, body: confirmHide(hiding), actionLabel: "Hide facet", danger: true, onConfirm: () => { onHide(hiding.key); setHiding(null); }, onClose: () => setHiding(null) })) : null] }));
89
+ }
90
+ /* ------------------------------------------------------------- the values */
91
+ const List = styled.div `
92
+ display: flex;
93
+ flex-direction: column;
94
+ gap: 1px;
95
+ padding: 0 6px 4px;
96
+ `;
97
+ const Actions = styled.span `
98
+ position: relative;
99
+ display: none;
100
+ gap: 2px;
101
+ `;
102
+ const Meta = styled.span `
103
+ position: relative;
104
+ color: ${v.faint};
105
+ font-size: 11px;
106
+ font-variant-numeric: tabular-nums;
107
+ white-space: nowrap;
108
+ `;
109
+ const ValueRowWrap = styled.div `
110
+ position: relative;
111
+ display: flex;
112
+ align-items: center;
113
+ gap: 8px;
114
+ min-height: 28px;
115
+ padding: 0 8px;
116
+ border-radius: ${v.rCtl};
117
+ font-size: 12px;
118
+ color: ${(p) => (p.$state === "off" ? v.faint : v.text)};
119
+ overflow: hidden;
120
+ cursor: pointer;
121
+ ${(p) => p.$state === "on" && `background: ${v.brand12};`}
122
+ &:hover { background: ${v.hover}; }
123
+ &:focus-visible { outline: none; box-shadow: ${v.ring}; }
124
+ /* On hover or keyboard focus the actions take the meta's place. */
125
+ &:hover ${Actions}, &:focus-within ${Actions} { display: inline-flex; }
126
+ &:hover ${Meta}, &:focus-within ${Meta} { display: none; }
127
+ input { position: relative; margin: 0; pointer-events: none; }
128
+ `;
129
+ // The share bar sits behind the row, as in RankList: the list reads as a
130
+ // distribution at a glance without costing a column.
131
+ const Bar = styled.span `
132
+ position: absolute;
133
+ inset: 0 auto 0 0;
134
+ width: ${(p) => Math.max(2, p.$share * 100)}%;
135
+ background: ${v.brand08};
136
+ pointer-events: none;
137
+ `;
138
+ const Label = styled.span `
139
+ position: relative;
140
+ flex: 1;
141
+ min-width: 0;
142
+ overflow: hidden;
143
+ text-overflow: ellipsis;
144
+ white-space: nowrap;
145
+ ${(p) => p.$struck && "text-decoration: line-through;"}
146
+ `;
147
+ const Action = styled.button `
148
+ height: 20px;
149
+ padding: 0 6px;
150
+ border: 1px solid ${v.line2};
151
+ border-radius: ${v.rCtl};
152
+ background: ${v.surface2};
153
+ color: ${v.muted};
154
+ font-size: 10.5px;
155
+ cursor: pointer;
156
+ &:hover { color: ${v.text}; border-color: ${v.brand55}; }
157
+ `;
158
+ const More = styled.button `
159
+ align-self: flex-start;
160
+ margin: 2px 8px 0;
161
+ padding: 0;
162
+ border: 0;
163
+ background: none;
164
+ color: ${v.muted};
165
+ font-size: 11px;
166
+ cursor: pointer;
167
+ &:hover { color: ${v.text}; }
168
+ `;
169
+ const Note = styled.div `
170
+ padding: 8px 14px;
171
+ color: ${v.faint};
172
+ font-size: 11.5px;
173
+ `;
174
+ /**
175
+ * FacetValueRow: one value as a selector — a share bar behind, a checkbox,
176
+ * the label, the count and share in tabular figures, and on hover **only**
177
+ * and **exclude** in the figures' place. An excluded row is struck through
178
+ * and its click lifts the exclusion.
179
+ */
180
+ export function FacetValueRow({ facetKey, value, count, share, state, label, onToggle, onOnly, onExclude, onUnexclude }) {
181
+ const click = () => (state === "off" ? onUnexclude() : onToggle());
182
+ const n = typeof count === "bigint" ? Number(count) : count;
183
+ return (_jsxs(ValueRowWrap, { role: "option", "aria-selected": state === "on", tabIndex: 0, "$state": state, "data-testid": `facet-value-${facetKey}-${value}`, title: value, onClick: click, onKeyDown: (e) => {
184
+ if (e.key === "Enter" || e.key === " ") {
185
+ e.preventDefault();
186
+ click();
187
+ }
188
+ }, children: [_jsx(Bar, { "$share": share }), _jsx("input", { type: "checkbox", tabIndex: -1, readOnly: true, checked: state === "on", "aria-hidden": true }), _jsx(Label, { "$struck": state === "off", children: label ?? (value || "(empty)") }), _jsx(Meta, { children: state === "off" ? "excluded" : n ? `${fmtCount(n)} · ${fmtShare(share)}` : "—" }), _jsxs(Actions, { children: [_jsx(Action, { type: "button", "aria-label": `only ${facetKey}=${value}`, onClick: (e) => { e.stopPropagation(); onOnly(); }, children: "only" }), state !== "off" ? (_jsx(Action, { type: "button", "aria-label": `exclude ${facetKey}=${value}`, onClick: (e) => { e.stopPropagation(); onExclude(); }, children: "exclude" })) : null] })] }));
189
+ }
190
+ /**
191
+ * FacetValueList: one facet's values, as a selector.
192
+ *
193
+ * - a click toggles the value in or out of the selection (an excluded value's
194
+ * click lifts the exclusion);
195
+ * - hover offers **only** and **exclude**;
196
+ * - excluded values stay listed, struck through, with their counts, so there
197
+ * is always something to click to undo;
198
+ * - selected or excluded values the counts did not return are still listed
199
+ * (with no count), for the same reason;
200
+ * - `shown` rows by default, "show more" for the rest, and a search box once
201
+ * the facet has more than `searchFrom` values. Rank order is kept as it is:
202
+ * moving a value to the top when it is clicked would put a different row
203
+ * under the cursor for the next click.
204
+ */
205
+ export function FacetValueList({ facetKey, values, selected, excluded, loading = false, shown = 30, searchFrom = 10, labelOf, onToggle, onOnly, onExclude, onUnexclude }) {
206
+ const [expanded, setExpanded] = useState(false);
207
+ const [needle, setNeedle] = useState("");
208
+ const items = useMemo(() => {
209
+ const seen = new Set(values.map((o) => o.value));
210
+ const counted = values.map((o) => ({
211
+ ...o,
212
+ state: selected.includes(o.value) ? "on" : excluded.includes(o.value) ? "off" : "none",
213
+ }));
214
+ const missing = [...selected, ...excluded]
215
+ .filter((value) => !seen.has(value))
216
+ .map((value) => ({ value, count: 0, share: 0, state: selected.includes(value) ? "on" : "off" }));
217
+ return [...counted, ...missing];
218
+ }, [values, selected, excluded]);
219
+ const q = needle.toLowerCase();
220
+ const filtered = q ? items.filter((i) => i.value.toLowerCase().includes(q)) : items;
221
+ // Collapsed, the list is the top {shown} plus any selected or excluded value
222
+ // ranked below them, so a selection is never hidden behind "show more".
223
+ const visible = expanded || q ? filtered : filtered.filter((item, i) => i < shown || item.state !== "none");
224
+ const hidden = filtered.length - visible.length;
225
+ if (items.length === 0)
226
+ return _jsx(Note, { children: loading ? "loading…" : "no values in range" });
227
+ return (_jsxs(List, { role: "listbox", "aria-multiselectable": "true", "aria-label": `${facetKey} values`, children: [items.length > searchFrom ? (_jsx(Input, { style: { margin: "2px 2px 4px", height: 26, fontSize: 11.5 }, placeholder: `search ${items.length} values…`, "aria-label": `search ${facetKey} values`, value: needle, onChange: (e) => setNeedle(e.currentTarget.value) })) : null, visible.map((item) => (_jsx(FacetValueRow, { facetKey: facetKey, value: item.value, count: item.count, share: item.share, state: item.state, label: labelOf?.(item.value), onToggle: () => onToggle(item.value), onOnly: () => onOnly(item.value), onExclude: () => onExclude(item.value), onUnexclude: () => onUnexclude(item.value) }, item.value))), q && filtered.length === 0 ? _jsxs(Note, { children: ["no values match \u201C", needle, "\u201D"] }) : null, hidden > 0 ? _jsxs(More, { type: "button", onClick: () => setExpanded(true), children: ["show ", hidden, " more"] }) : null, expanded && !q && filtered.length > shown ? _jsx(More, { type: "button", onClick: () => setExpanded(false), children: "show fewer" }) : null] }));
228
+ }
229
+ /* --------------------------------------------------------- the page frame */
230
+ const Frame = styled.div `
231
+ display: grid;
232
+ grid-template-columns: ${(p) => p.$rail}px minmax(0, 1fr);
233
+ gap: 0 ${(p) => p.$gap}px;
234
+ align-items: start;
235
+ min-width: 0;
236
+ > * { min-width: 0; }
237
+ @media (max-width: ${(p) => p.$at}px) {
238
+ grid-template-columns: minmax(0, 1fr);
239
+ }
240
+ `;
241
+ // The rail's column: a hairline on its right edge, as the Logs workspace's
242
+ // pane has, rather than a card — a facet rail is furniture, not content. It
243
+ // stays in view while the list scrolls, and scrolls its own values.
244
+ const RailColumn = styled.aside `
245
+ position: sticky;
246
+ top: ${(p) => p.$top}px;
247
+ max-height: calc(100vh - ${(p) => p.$top * 2}px);
248
+ border-right: 1px solid ${v.line};
249
+ display: flex;
250
+ flex-direction: column;
251
+ min-height: 0;
252
+ `;
253
+ const MainColumn = styled.section `
254
+ display: flex;
255
+ flex-direction: column;
256
+ gap: 10px;
257
+ min-width: 0;
258
+ `;
259
+ const Toolbar = styled.div `
260
+ display: flex;
261
+ align-items: center;
262
+ gap: 8px;
263
+ flex-wrap: wrap;
264
+ min-height: 30px;
265
+ `;
266
+ /**
267
+ * FacetedListLayout: the page frame for "a facet rail on the left, a toolbar,
268
+ * a table" — the shape every list with facets has, and that three consoles
269
+ * had each laid out by hand with a different width, gap and edge.
270
+ *
271
+ * The rail is a fixed column with a hairline edge that sticks while the list
272
+ * scrolls; the toolbar sits level with the rail's head; the list fills the
273
+ * rest. Below `at` the rail leaves the grid and opens from a *facets* button
274
+ * in the toolbar as a `Drawer`, the way the Lantern workspaces do at phone
275
+ * width. A fill-height workspace (Logs, Traces) keeps its own panes and
276
+ * draws the same `FacetRail` in them; this frame is for the page-scrolling
277
+ * lists.
278
+ */
279
+ export function FacetedListLayout({ rail, toolbar, children, railWidth = 240, gap = 16, at = 900, stickyTop = 8, drawerTitle = "Facets", active }) {
280
+ const [open, setOpen] = useState(false);
281
+ const [narrow, setNarrow] = useState(() => typeof window !== "undefined" && !!window.matchMedia && window.matchMedia(`(max-width: ${at}px)`).matches);
282
+ useMatch(`(max-width: ${at}px)`, setNarrow);
283
+ return (_jsxs(Frame, { "$rail": railWidth, "$gap": gap, "$at": at, "data-testid": "faceted-list", children: [!narrow ? _jsx(RailColumn, { "$top": stickyTop, children: rail }) : null, _jsxs(MainColumn, { children: [narrow || toolbar ? (_jsxs(Toolbar, { children: [narrow ? (_jsxs(AppButton, { size: "xs", variant: "quiet", icon: "filter", onClick: () => setOpen(true), "data-testid": "facets-open", children: ["facets", active ? ` · ${active}` : ""] })) : null, toolbar] })) : null, children] }), narrow ? (_jsx(Drawer, { open: open, title: drawerTitle, width: 320, onClose: () => setOpen(false), children: rail })) : null] }));
284
+ }
285
+ function useMatch(query, onChange) {
286
+ useEffect(() => {
287
+ if (typeof window === "undefined" || !window.matchMedia)
288
+ return;
289
+ const mq = window.matchMedia(query);
290
+ const fn = (e) => onChange(e.matches);
291
+ onChange(mq.matches);
292
+ mq.addEventListener("change", fn);
293
+ return () => mq.removeEventListener("change", fn);
294
+ }, [query, onChange]);
295
+ }
296
+ //# sourceMappingURL=FacetRail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FacetRail.js","sourceRoot":"","sources":["../../src/kit/FacetRail.tsx"],"names":[],"mappings":"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"}
@@ -1,8 +1,15 @@
1
+ import { type ChartTone } from "./chartScale.ts";
1
2
  export interface SparklineProps {
2
3
  /** `[x, y]` pairs — x is usually epoch millis; order does not matter */
3
4
  points: [number, number][];
4
5
  /** stroke colour; a token (`v.cat1`, `v.success`), never a literal */
5
6
  colour?: string | undefined;
7
+ /** the colour as a chart tone (ok · warn · crit · info); wins over `series` */
8
+ tone?: ChartTone | undefined;
9
+ /** the colour as the nth step of the chart ramp, so a row's sparkline matches its line on a chart */
10
+ series?: number | undefined;
11
+ /** a dot on the last value, as the S size of a chart draws it */
12
+ lastDot?: boolean | undefined;
6
13
  width?: number | undefined;
7
14
  height?: number | undefined;
8
15
  /**
@@ -36,7 +43,7 @@ export interface SparklineProps {
36
43
  * screen. These answer "is it trending", not "how does it compare" — a column
37
44
  * that needs the second question wants a `Meter` or a number.
38
45
  */
39
- export declare function Sparkline({ points, colour, width, height, zeroBased, area, markAt, empty, label, formatValue, formatX, }: SparklineProps): import("react").JSX.Element;
46
+ export declare function Sparkline({ points, colour: colourProp, tone, series, lastDot, width, height, zeroBased, area, markAt, empty, label, formatValue, formatX, }: SparklineProps): import("react").JSX.Element;
40
47
  /**
41
48
  * SparkRow: a named sparkline with its latest value.
42
49
  *
@@ -1 +1 @@
1
- {"version":3,"file":"Sparkline.d.ts","sourceRoot":"","sources":["../../src/kit/Sparkline.tsx"],"names":[],"mappings":"AAqDA,MAAM,WAAW,cAAc;IAC7B,wEAAwE;IACxE,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;IAC3B,sEAAsE;IACtE,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAChC,iEAAiE;IACjE,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC3B;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,8EAA8E;IAC9E,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,sEAAsE;IACtE,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC,GAAG,SAAS,CAAC;IAClD,yEAAyE;IACzE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC,GAAG,SAAS,CAAC;CAC/C;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,EACxB,MAAM,EAAE,MAAgB,EAAE,KAAU,EAAE,MAAW,EAAE,SAAgB,EAAE,IAAW,EAAE,MAAM,EAAE,KAAW,EAAE,KAAK,EAC5G,WAAW,EAAE,OAAO,GACrB,EAAE,cAAc,+BAuEhB;AAyBD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAiB,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,GAAG;IACtF,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,MAAM,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;CAC3C,+BAmBA"}
1
+ {"version":3,"file":"Sparkline.d.ts","sourceRoot":"","sources":["../../src/kit/Sparkline.tsx"],"names":[],"mappings":"AAGA,OAAO,EAA0B,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAmDzE,MAAM,WAAW,cAAc;IAC7B,wEAAwE;IACxE,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;IAC3B,sEAAsE;IACtE,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,+EAA+E;IAC/E,IAAI,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAC7B,qGAAqG;IACrG,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,iEAAiE;IACjE,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAChC,iEAAiE;IACjE,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC3B;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,8EAA8E;IAC9E,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,sEAAsE;IACtE,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC,GAAG,SAAS,CAAC;IAClD,yEAAyE;IACzE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC,GAAG,SAAS,CAAC;CAC/C;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,EACxB,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,OAAe,EAAE,KAAU,EAAE,MAAW,EAAE,SAAgB,EAAE,IAAW,EAAE,MAAM,EAAE,KAAW,EAAE,KAAK,EAC7I,WAAW,EAAE,OAAO,GACrB,EAAE,cAAc,+BAyEhB;AAyBD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAiB,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,GAAG;IACtF,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,MAAM,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;CAC3C,+BAmBA"}
@@ -2,6 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useMemo, useState } from "react";
3
3
  import styled from "styled-components";
4
4
  import { v } from "../theme/tokens.js";
5
+ import { TONE_COLOUR, rampToken } from "./chartScale.js";
5
6
  // Sparkline — shape without a value, for a table cell.
6
7
  //
7
8
  // `LineChart` answers "what was the number at 14:02"; it has axes, a crosshair
@@ -55,7 +56,8 @@ const Flat = styled.span `
55
56
  * screen. These answer "is it trending", not "how does it compare" — a column
56
57
  * that needs the second question wants a `Meter` or a number.
57
58
  */
58
- export function Sparkline({ points, colour = v.brand, width = 90, height = 22, zeroBased = true, area = true, markAt, empty = "—", label, formatValue, formatX, }) {
59
+ export function Sparkline({ points, colour: colourProp, tone, series, lastDot = false, width = 90, height = 22, zeroBased = true, area = true, markAt, empty = "—", label, formatValue, formatX, }) {
60
+ const colour = colourProp ?? (tone ? TONE_COLOUR[tone] : series !== undefined ? rampToken(series) : v.brand);
59
61
  const [hover, setHover] = useState(null);
60
62
  const geometry = useMemo(() => {
61
63
  const finite = points.filter((p) => Number.isFinite(p[0]) && Number.isFinite(p[1])).sort((a, b) => a[0] - b[0]);
@@ -72,12 +74,12 @@ export function Sparkline({ points, colour = v.brand, width = 90, height = 22, z
72
74
  // zero; a series at a constant 400ms is a real answer, not missing data.
73
75
  const spanY = maxY - minY || 1;
74
76
  const px = (x) => ((x - minX) / spanX) * width;
75
- const py = (y) => height - 1 - ((y - minY) / spanY) * (height - 2);
77
+ const py = (y) => height - 2 - ((y - minY) / spanY) * (height - 4);
76
78
  const line = finite.map((p, i) => `${i === 0 ? "M" : "L"}${px(p[0]).toFixed(1)},${py(p[1]).toFixed(1)}`).join(" ");
77
79
  const under = `${line} L${px(maxX).toFixed(1)},${height} L${px(minX).toFixed(1)},${height} Z`;
78
80
  const mark = markAt !== undefined && markAt >= minX && markAt <= maxX ? px(markAt) : null;
79
81
  const dots = finite.map((p) => ({ x: px(p[0]), y: py(p[1]), raw: p }));
80
- return { line, under, mark, dots };
82
+ return { line, under, mark, dots, last: dots[dots.length - 1] };
81
83
  }, [points, width, height, zeroBased, markAt]);
82
84
  if (!geometry) {
83
85
  return (_jsx(Wrap, { "$w": width, "$h": height, children: _jsx(Flat, { children: empty }) }));
@@ -94,7 +96,7 @@ export function Sparkline({ points, colour = v.brand, width = 90, height = 22, z
94
96
  setHover(best);
95
97
  }
96
98
  : undefined;
97
- return (_jsxs(Wrap, { "$w": width, "$h": height, children: [dot && formatValue ? (_jsxs(Readout, { style: { left: Math.max(0, Math.min(width, dot.x)) }, children: [formatValue(dot.raw[1]), formatX ? ` · ${formatX(dot.raw[0])}` : ""] })) : null, _jsxs("svg", { width: width, height: height, viewBox: `0 0 ${width} ${height}`, onMouseMove: onMove, onMouseLeave: formatValue ? () => setHover(null) : undefined, ...(label ? { role: "img", "aria-label": label } : { "aria-hidden": true }), children: [area ? _jsx("path", { d: geometry.under, fill: colour, opacity: 0.14 }) : null, _jsx("path", { d: geometry.line, fill: "none", stroke: colour, strokeWidth: 1.2 }), dot ? _jsx("circle", { cx: dot.x, cy: dot.y, r: 2.2, fill: colour }) : null, geometry.mark !== null ? (_jsx("line", { x1: geometry.mark, x2: geometry.mark, y1: 0, y2: height, stroke: v.warning, strokeWidth: 1, strokeDasharray: "2 2" })) : null] })] }));
99
+ return (_jsxs(Wrap, { "$w": width, "$h": height, children: [dot && formatValue ? (_jsxs(Readout, { style: { left: Math.max(0, Math.min(width, dot.x)) }, children: [formatValue(dot.raw[1]), formatX ? ` · ${formatX(dot.raw[0])}` : ""] })) : null, _jsxs("svg", { width: width, height: height, viewBox: `0 0 ${width} ${height}`, onMouseMove: onMove, onMouseLeave: formatValue ? () => setHover(null) : undefined, ...(label ? { role: "img", "aria-label": label } : { "aria-hidden": true }), children: [area ? _jsx("path", { d: geometry.under, fill: colour, opacity: 0.12 }) : null, _jsx("path", { d: geometry.line, fill: "none", stroke: colour, strokeWidth: 1.5, strokeLinejoin: "round", strokeLinecap: "round" }), lastDot && !dot ? _jsx("circle", { cx: geometry.last.x, cy: geometry.last.y, r: 2.2, fill: colour }) : null, dot ? _jsx("circle", { cx: dot.x, cy: dot.y, r: 2.2, fill: colour }) : null, geometry.mark !== null ? (_jsx("line", { x1: geometry.mark, x2: geometry.mark, y1: 0, y2: height, stroke: v.warning, strokeWidth: 1, strokeDasharray: "2 2" })) : null] })] }));
98
100
  }
99
101
  const RowWrap = styled.span `
100
102
  display: flex;
@@ -1 +1 @@
1
- {"version":3,"file":"Sparkline.js","sourceRoot":"","sources":["../../src/kit/Sparkline.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Sparkline.js","sourceRoot":"","sources":["../../src/kit/Sparkline.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Four sizes, and nothing in between. Height is the size's, width is the grid's.
3
+ *
4
+ * - `s` — a sparkline (20–36 px): no axes, a last-value dot; table cells, stat tiles.
5
+ * - `m` — a card (180–220 px): the default on a service page and a dashboard.
6
+ * - `l` — a panel (260–320 px): when the chart is the point of the page (a monitor, an alert); marker labels always on.
7
+ * - `xl` — a hero (300–420 px): the explorer, a widget opened on its own.
8
+ */
9
+ export type ChartSize = "s" | "m" | "l" | "xl";
10
+ export interface ChartSizeSpec {
11
+ /** plot height in px */
12
+ height: number;
13
+ /** value-axis ticks to aim for (3–5); 0 draws no axis */
14
+ yTicks: number;
15
+ /** time-axis ticks to aim for (5–7); 0 draws no axis */
16
+ xTicks: number;
17
+ /** legend chips under the plot */
18
+ legend: boolean;
19
+ /** marker labels drawn at rest rather than on hover */
20
+ markerLabels: boolean;
21
+ }
22
+ export declare const CHART_SIZES: Record<ChartSize, ChartSizeSpec>;
23
+ /** The size a ChartFrame gives the chart inside it. */
24
+ export declare const ChartSizeContext: import("react").Context<ChartSize | null>;
25
+ /** A chart's size: its own prop, else its frame's, else `m`. */
26
+ export declare function useChartSize(size: ChartSize | undefined): ChartSize;
27
+ /** The eight-step series ramp, as tokens, in assignment order. */
28
+ export declare const CHART_RAMP: readonly string[];
29
+ /** The nth series' colour token, wrapping past the eighth. */
30
+ export declare function rampToken(i: number): string;
31
+ /** Tones a series, threshold, band or segment may take instead of a ramp step. */
32
+ export type ChartTone = "brand" | "ok" | "warn" | "crit" | "info" | "mut";
33
+ export declare const TONE_COLOUR: Record<ChartTone, string>;
34
+ /** A percentile's colour on the p50 light → p99 hot ramp. */
35
+ export declare function percentileToken(p: number): string;
36
+ /**
37
+ * Which of a run of ascending positions keep their label: each at least `gap`
38
+ * px after the last one kept, so two labels never touch.
39
+ */
40
+ export declare function spaced(positions: number[], gap: number): boolean[];
41
+ /** The smallest of 1, 2, 2.5, 5 × 10ⁿ that is at least `raw`. */
42
+ export declare function niceStep(raw: number): number;
43
+ /**
44
+ * Nice value ticks covering `[lo, hi]`: about `count` of them (3–5 is the
45
+ * board's rule), on 1/2/2.5/5 × 10ⁿ, starting at or below `lo` and ending at
46
+ * or above `hi`. The returned `min`/`max` are the axis ends.
47
+ */
48
+ export declare function niceTicks(lo: number, hi: number, count?: number): {
49
+ ticks: number[];
50
+ min: number;
51
+ max: number;
52
+ };
53
+ /**
54
+ * How an axis end reads for a series covering `span` ms: a few hours read
55
+ * 14:05, a few days 16 Oct 14:00, a few months 16 Oct, anything longer
56
+ * Oct 2026 (CON-73). Local time; a series bucketed in some other zone passes
57
+ * `formatTime`.
58
+ */
59
+ export declare function timeTick(span: number): (t: number) => string;
60
+ /** How one bucket or sample reads in a tooltip, from the step between them. */
61
+ export declare function timeDetail(step: number): (t: number) => string;
62
+ /** A bucket width as the tooltip says it ("1 m bucket"). */
63
+ export declare function stepLabel(step: number): string;
64
+ export interface TimeTickMark {
65
+ t: number;
66
+ label: string;
67
+ /** a date shown at a midnight crossing: drawn dim */
68
+ dim: boolean;
69
+ }
70
+ /**
71
+ * Time ticks for `[from, to]`: about `count` (5–7 is the board's rule) on a
72
+ * round step (1 m … 14 d, then months), aligned to local time so an hourly
73
+ * axis reads 18:00, 19:00. Within a day the labels are times, and a tick at
74
+ * a midnight crossing reads the date instead, dim — never a second date line.
75
+ * Longer spans label as `timeTick` does. `format` overrides every label.
76
+ */
77
+ export declare function timeTicks(from: number, to: number, count?: number, format?: (t: number) => string): TimeTickMark[];
78
+ //# sourceMappingURL=chartScale.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chartScale.d.ts","sourceRoot":"","sources":["../../src/kit/chartScale.ts"],"names":[],"mappings":"AAQA;;;;;;;GAOG;AACH,MAAM,MAAM,SAAS,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC;AAE/C,MAAM,WAAW,aAAa;IAC5B,wBAAwB;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,MAAM,EAAE,MAAM,CAAC;IACf,wDAAwD;IACxD,MAAM,EAAE,MAAM,CAAC;IACf,kCAAkC;IAClC,MAAM,EAAE,OAAO,CAAC;IAChB,uDAAuD;IACvD,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,SAAS,EAAE,aAAa,CAKxD,CAAC;AAEF,uDAAuD;AACvD,eAAO,MAAM,gBAAgB,2CAAwC,CAAC;AAEtE,gEAAgE;AAChE,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAGnE;AAMD,kEAAkE;AAClE,eAAO,MAAM,UAAU,EAAE,SAAS,MAAM,EAEvC,CAAC;AAEF,8DAA8D;AAC9D,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAG3C;AAED,kFAAkF;AAClF,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;AAE1E,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAEjD,CAAC;AAEF,6DAA6D;AAC7D,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAIjD;AAED;;;GAGG;AACH,wBAAgB,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,EAAE,CASlE;AAMD,iEAAiE;AACjE,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAK5C;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAiB1G;AAgBD;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAK5D;AAED,+EAA+E;AAC/E,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAI9D;AAED,4DAA4D;AAC5D,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM9C;AAQD,MAAM,WAAW,YAAY;IAC3B,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,qDAAqD;IACrD,GAAG,EAAE,OAAO,CAAC;CACd;AASD;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,SAAI,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,YAAY,EAAE,CA2C7G"}