@xeonr/platform-ui 0.2.5 → 0.3.2

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.
Files changed (65) hide show
  1. package/dist/index.d.ts +12 -7
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +16 -7
  4. package/dist/index.js.map +1 -1
  5. package/dist/kit/Badge.d.ts +2 -1
  6. package/dist/kit/Badge.d.ts.map +1 -1
  7. package/dist/kit/Badge.js +23 -0
  8. package/dist/kit/Badge.js.map +1 -1
  9. package/dist/kit/Blocks.d.ts +22 -2
  10. package/dist/kit/Blocks.d.ts.map +1 -1
  11. package/dist/kit/Blocks.js +108 -17
  12. package/dist/kit/Blocks.js.map +1 -1
  13. package/dist/kit/Card.d.ts +44 -0
  14. package/dist/kit/Card.d.ts.map +1 -0
  15. package/dist/kit/Card.js +95 -0
  16. package/dist/kit/Card.js.map +1 -0
  17. package/dist/kit/Charts.d.ts +44 -0
  18. package/dist/kit/Charts.d.ts.map +1 -0
  19. package/dist/kit/Charts.js +164 -0
  20. package/dist/kit/Charts.js.map +1 -0
  21. package/dist/kit/DataTable.d.ts +3 -1
  22. package/dist/kit/DataTable.d.ts.map +1 -1
  23. package/dist/kit/DataTable.js +8 -2
  24. package/dist/kit/DataTable.js.map +1 -1
  25. package/dist/kit/Facet.d.ts +37 -0
  26. package/dist/kit/Facet.d.ts.map +1 -0
  27. package/dist/kit/Facet.js +126 -0
  28. package/dist/kit/Facet.js.map +1 -0
  29. package/dist/kit/Form.d.ts +8 -0
  30. package/dist/kit/Form.d.ts.map +1 -1
  31. package/dist/kit/Form.js +17 -0
  32. package/dist/kit/Form.js.map +1 -1
  33. package/dist/kit/Icon.d.ts +17 -0
  34. package/dist/kit/Icon.d.ts.map +1 -1
  35. package/dist/kit/Icon.js +6 -1
  36. package/dist/kit/Icon.js.map +1 -1
  37. package/dist/kit/Range.d.ts +30 -0
  38. package/dist/kit/Range.d.ts.map +1 -0
  39. package/dist/kit/Range.js +137 -0
  40. package/dist/kit/Range.js.map +1 -0
  41. package/dist/kit/Search.d.ts +9 -0
  42. package/dist/kit/Search.d.ts.map +1 -0
  43. package/dist/kit/Search.js +59 -0
  44. package/dist/kit/Search.js.map +1 -0
  45. package/dist/kit/Secret.d.ts +10 -0
  46. package/dist/kit/Secret.d.ts.map +1 -1
  47. package/dist/kit/Secret.js +33 -0
  48. package/dist/kit/Secret.js.map +1 -1
  49. package/dist/kit/Skeleton.d.ts +6 -0
  50. package/dist/kit/Skeleton.d.ts.map +1 -1
  51. package/dist/kit/Skeleton.js +15 -0
  52. package/dist/kit/Skeleton.js.map +1 -1
  53. package/dist/kit/Toast.d.ts +10 -2
  54. package/dist/kit/Toast.d.ts.map +1 -1
  55. package/dist/kit/Toast.js +9 -2
  56. package/dist/kit/Toast.js.map +1 -1
  57. package/dist/theme/ThemeProvider.d.ts +15 -2
  58. package/dist/theme/ThemeProvider.d.ts.map +1 -1
  59. package/dist/theme/ThemeProvider.js +43 -53
  60. package/dist/theme/ThemeProvider.js.map +1 -1
  61. package/dist/theme/tokens.d.ts +3 -0
  62. package/dist/theme/tokens.d.ts.map +1 -1
  63. package/dist/theme/tokens.js +59 -0
  64. package/dist/theme/tokens.js.map +1 -1
  65. package/package.json +1 -1
@@ -0,0 +1,95 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import styled, { css } from "styled-components";
3
+ import { Link } from "react-router-dom";
4
+ import { v } from "../theme/tokens.js";
5
+ import { Icon } from "./Icon.js";
6
+ // The card list. A list of things too few and too visual for a DataTable — a
7
+ // team picker, a project picker, a handful of environments — reads as cards,
8
+ // and three consoles had grown their own `Grid`/`Card` pair for it
9
+ // (container-platform's pools, dbaas' teams, dev's environments). This is that
10
+ // pair, with the differences between them as props.
11
+ /** CardGrid: auto-fill columns that reflow; `$min` is the narrowest a card gets. */
12
+ export const CardGrid = styled.div `
13
+ display: grid;
14
+ gap: ${(p) => p.$gap ?? 12}px;
15
+ grid-template-columns: repeat(auto-fill, minmax(${(p) => p.$min ?? 300}px, 1fr));
16
+ `;
17
+ const shell = css `
18
+ display: flex;
19
+ flex-direction: column;
20
+ min-width: 0;
21
+ background: ${v.surface};
22
+ border: 1px solid ${(p) => (p.$tone === "crit" ? v.danger : p.$tone === "warn" ? v.warning : v.line)};
23
+ border-radius: ${v.rCard};
24
+ box-shadow: inset 0 1px 0 0 ${v.brand08}, ${v.elev};
25
+ color: inherit;
26
+ text-align: left;
27
+ text-decoration: none;
28
+ overflow: hidden;
29
+ ${(p) => p.$interactive &&
30
+ css `
31
+ cursor: pointer;
32
+ transition: border-color 0.14s ease, transform 0.14s ease;
33
+ &:hover { border-color: ${v.brand55}; transform: translateY(-1px); }
34
+ &:focus-visible { outline: 2px solid ${v.brand55}; outline-offset: 2px; }
35
+ `}
36
+ `;
37
+ const DivShell = styled.div `${shell}`;
38
+ const AShell = styled.a `${shell}`;
39
+ const LinkShell = styled(Link) `${shell}`;
40
+ const Head = styled.div `
41
+ display: flex;
42
+ align-items: center;
43
+ gap: 10px;
44
+ padding: 14px 16px 0;
45
+ svg { flex: none; color: ${v.brand}; }
46
+ `;
47
+ const Title = styled.div `
48
+ flex: 1;
49
+ min-width: 0;
50
+ font-weight: 600;
51
+ font-size: 14px;
52
+ overflow: hidden;
53
+ text-overflow: ellipsis;
54
+ white-space: nowrap;
55
+ ${(p) => p.$mono && css `font-family: ${v.mono}; font-size: 13px;`}
56
+ `;
57
+ const Facts = styled.div `
58
+ display: flex;
59
+ flex-wrap: wrap;
60
+ align-items: center;
61
+ gap: 6px;
62
+ padding: 10px 16px 0;
63
+ color: ${v.muted};
64
+ font-size: 12px;
65
+ `;
66
+ const Body = styled.div `
67
+ padding: 12px 16px 0;
68
+ min-width: 0;
69
+ `;
70
+ const Actions = styled.div `
71
+ display: flex;
72
+ align-items: center;
73
+ gap: 8px;
74
+ padding: 14px 16px;
75
+ margin-top: auto;
76
+ `;
77
+ /**
78
+ * ListCard: one card in a CardGrid.
79
+ *
80
+ * `to`/`href` make the whole card the link. `actions` and a whole-card link are
81
+ * mutually exclusive by construction — a link wrapping buttons is invalid
82
+ * markup and unusable by keyboard — so a card with actions renders as a plain
83
+ * surface and the actions carry the navigation.
84
+ */
85
+ export function ListCard({ title, icon, mono, status, facts, actions, tone, to, href, target, rel, children, className, tooltip, }) {
86
+ const inner = (_jsxs(_Fragment, { children: [_jsxs(Head, { children: [icon ? _jsx(Icon, { name: icon }) : null, _jsx(Title, { "$mono": mono, title: tooltip ?? (typeof title === "string" ? title : undefined), children: title }), status] }), facts ? _jsx(Facts, { children: facts }) : null, children ? _jsx(Body, { children: children }) : null, actions ? _jsx(Actions, { children: actions }) : null] }));
87
+ if (to && !actions) {
88
+ return _jsx(LinkShell, { to: to, "$tone": tone, "$interactive": true, className: className, children: inner });
89
+ }
90
+ if (href && !actions) {
91
+ return _jsx(AShell, { href: href, target: target, rel: rel, "$tone": tone, "$interactive": true, className: className, children: inner });
92
+ }
93
+ return _jsx(DivShell, { "$tone": tone, className: className, children: inner });
94
+ }
95
+ //# sourceMappingURL=Card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Card.js","sourceRoot":"","sources":["../../src/kit/Card.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ export interface HistogramBucket {
2
+ /** bucket start, ms since epoch */
3
+ t: number;
4
+ /** stacked parts, in stack order */
5
+ parts: {
6
+ name: string;
7
+ value: number;
8
+ }[];
9
+ }
10
+ /** Tones a part may take; unnamed parts use the brand colour. */
11
+ export type ChartTone = "brand" | "ok" | "warn" | "crit" | "info" | "mut";
12
+ /**
13
+ * Histogram: a stacked bar per bucket over time, so the shape of what you are
14
+ * looking at is visible before you read a single row. `tones` maps a part
15
+ * name to its tone (e.g. error → crit) so a spike reads without a legend.
16
+ */
17
+ export declare function Histogram({ buckets, tones, height, label, empty }: {
18
+ buckets: HistogramBucket[];
19
+ tones?: Record<string, ChartTone> | undefined;
20
+ height?: number | undefined;
21
+ label?: string | undefined;
22
+ empty?: string | undefined;
23
+ }): import("react").JSX.Element;
24
+ export interface ChartSeries {
25
+ name: string;
26
+ points: {
27
+ t: number;
28
+ v: number;
29
+ }[];
30
+ }
31
+ /**
32
+ * LineChart: n series over a shared time axis. Axes to read a value off, a
33
+ * crosshair to compare series at one instant, a legend that mutes lines, and
34
+ * a drag that selects a window (`onZoom`) — the natural gesture once a spike
35
+ * is visible.
36
+ */
37
+ export declare function LineChart({ series, onZoom, label, empty }: {
38
+ series: ChartSeries[];
39
+ /** Given a dragged selection. Omit to leave the chart read-only. */
40
+ onZoom?: ((from: Date, to: Date) => void) | undefined;
41
+ label?: string | undefined;
42
+ empty?: string | undefined;
43
+ }): import("react").JSX.Element;
44
+ //# sourceMappingURL=Charts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Charts.d.ts","sourceRoot":"","sources":["../../src/kit/Charts.tsx"],"names":[],"mappings":"AAiBA,MAAM,WAAW,eAAe;IAC9B,mCAAmC;IACnC,CAAC,EAAE,MAAM,CAAC;IACV,oCAAoC;IACpC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC1C;AAUD,iEAAiE;AACjE,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;AAK1E;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,EAAE,OAAO,EAAE,KAAU,EAAE,MAAM,EAAE,KAA4B,EAAE,KAA8B,EAAE,EAAE;IACvH,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,SAAS,CAAC;IAC9C,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B,+BA6BA;AAMD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACpC;AA0DD;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,KAAgB,EAAE,KAA6B,EAAE,EAAE;IAC7F,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,oEAAoE;IACpE,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IACtD,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B,+BA8GA"}
@@ -0,0 +1,164 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useMemo, useRef, useState } from "react";
3
+ import styled from "styled-components";
4
+ import { v } from "../theme/tokens.js";
5
+ import { fmtCount } from "./Facet.js";
6
+ // Two charts in raw SVG, themed with the tokens so they sit in the same visual
7
+ // system as everything else. No charting library: the need is "n series over a
8
+ // shared time axis" and "a stacked histogram", and a dependency for that costs
9
+ // more in bundle size and theming friction than the code it saves.
10
+ const hhmm = (t) => new Date(t).toLocaleTimeString(undefined, { hour: "2-digit", minute: "2-digit", hour12: false });
11
+ const HistWrap = styled.div `padding: 12px 14px 8px;`;
12
+ const HistSvg = styled.svg `display: block; width: 100%; height: 84px;`;
13
+ const Axis = styled.div `
14
+ display: flex; justify-content: space-between;
15
+ color: ${v.faint}; font-size: 11px; margin-top: 4px; font-variant-numeric: tabular-nums;
16
+ `;
17
+ const Note = styled.div `color: ${v.faint}; font-size: 12px; padding: 22px 0; text-align: center;`;
18
+ const TONE_FILL = {
19
+ brand: v.brand, ok: v.success, warn: v.warning, crit: v.danger, info: v.info, mut: v.faint,
20
+ };
21
+ /**
22
+ * Histogram: a stacked bar per bucket over time, so the shape of what you are
23
+ * looking at is visible before you read a single row. `tones` maps a part
24
+ * name to its tone (e.g. error → crit) so a spike reads without a legend.
25
+ */
26
+ export function Histogram({ buckets, tones = {}, height, label = "Activity over time", empty = "No activity in range" }) {
27
+ const sorted = useMemo(() => [...buckets].sort((a, b) => a.t - b.t), [buckets]);
28
+ if (sorted.length === 0)
29
+ return _jsx(HistWrap, { children: _jsx(Note, { children: empty }) });
30
+ const totals = sorted.map((b) => b.parts.reduce((s, p) => s + p.value, 0));
31
+ const max = Math.max(...totals, 1);
32
+ const w = 100 / sorted.length;
33
+ return (_jsxs(HistWrap, { children: [_jsx(HistSvg, { viewBox: "0 0 100 40", preserveAspectRatio: "none", role: "img", "aria-label": label, style: height ? { height } : undefined, children: sorted.map((b, i) => {
34
+ let y = 40;
35
+ return (_jsxs("g", { children: [_jsx("title", { children: `${hhmm(b.t)} — ${fmtCount(totals[i] ?? 0)}` }), b.parts.map((p) => {
36
+ const h = (p.value / max) * 40;
37
+ y -= h;
38
+ return _jsx("rect", { x: i * w + w * 0.12, y: y, width: w * 0.76, height: h, fill: TONE_FILL[tones[p.name] ?? "brand"] }, p.name);
39
+ })] }, b.t));
40
+ }) }), _jsxs(Axis, { children: [_jsx("span", { children: hhmm(sorted[0].t) }), _jsx("span", { children: hhmm(sorted[sorted.length - 1].t) })] })] }));
41
+ }
42
+ const Wrap = styled.div `padding: 14px;`;
43
+ const Plot = styled.div `position: relative;`;
44
+ const Svg = styled.svg `display: block; width: 100%; height: 220px; cursor: crosshair; user-select: none;`;
45
+ const Legend = styled.div `display: flex; flex-wrap: wrap; gap: 12px; margin-top: 10px; font-size: 12px; color: ${v.muted};`;
46
+ // Series colours come from the theme's accent ramp rather than a chart palette.
47
+ const STROKES = [v.brand, v.success, v.warning, v.info, v.danger];
48
+ // A legend entry is a control: clicking isolates or restores a series, which is
49
+ // the only way to read a chart split into a dozen sessions.
50
+ const Key = styled.button `
51
+ display: inline-flex; align-items: center; gap: 6px;
52
+ font: inherit; font-size: 12px;
53
+ color: ${(p) => (p.$off ? v.faint : v.muted)};
54
+ opacity: ${(p) => (p.$off ? 0.55 : 1)};
55
+ &::before { content: ""; width: 9px; height: 3px; border-radius: 2px; background: ${(p) => (p.$off ? v.faint : STROKES[p.$i % STROKES.length])}; }
56
+ &:hover { color: ${v.text}; }
57
+ `;
58
+ const ChartHint = styled.div `margin-top: 8px; font-size: 11px; color: ${v.faint};`;
59
+ const Tip = styled.div `
60
+ position: absolute;
61
+ top: 6px;
62
+ left: ${(p) => p.$left}%;
63
+ transform: translateX(${(p) => (p.$flip ? "-100%" : "0")});
64
+ margin-left: ${(p) => (p.$flip ? "-10px" : "10px")};
65
+ pointer-events: none;
66
+ background: ${v.surface2};
67
+ border: 1px solid ${v.line2};
68
+ border-radius: ${v.rCard};
69
+ box-shadow: ${v.elev};
70
+ padding: 7px 9px;
71
+ font-size: 11px;
72
+ color: ${v.text};
73
+ white-space: nowrap;
74
+ z-index: ${v.zPop};
75
+ .t { color: ${v.faint}; margin-bottom: 4px; }
76
+ .val { margin-left: auto; padding-left: 12px; font-variant-numeric: tabular-nums; }
77
+ `;
78
+ const TipRow = styled.div `
79
+ display: flex; align-items: center; gap: 6px;
80
+ &::before { content: ""; width: 8px; height: 3px; border-radius: 2px; background: ${(p) => STROKES[p.$i % STROKES.length]}; }
81
+ `;
82
+ const W = 600;
83
+ const H = 200;
84
+ const PAD_L = 44;
85
+ const PAD_B = 18;
86
+ const PAD_T = 8;
87
+ function tickValue(x) {
88
+ if (Math.abs(x) >= 1000)
89
+ return fmtCount(Math.round(x));
90
+ return Number.isInteger(x) ? String(x) : x.toFixed(2);
91
+ }
92
+ /**
93
+ * LineChart: n series over a shared time axis. Axes to read a value off, a
94
+ * crosshair to compare series at one instant, a legend that mutes lines, and
95
+ * a drag that selects a window (`onZoom`) — the natural gesture once a spike
96
+ * is visible.
97
+ */
98
+ export function LineChart({ series, onZoom, label = "Series", empty = "No samples in range" }) {
99
+ const svg = useRef(null);
100
+ const [hidden, setHidden] = useState(new Set());
101
+ const [hoverX, setHoverX] = useState(null);
102
+ const [drag, setDrag] = useState(null);
103
+ const shown = useMemo(() => series.filter((s) => !hidden.has(s.name)), [series, hidden]);
104
+ const points = shown.flatMap((s) => s.points);
105
+ const all = series.flatMap((s) => s.points.map((p) => p.t));
106
+ if (all.length === 0)
107
+ return _jsx(Wrap, { children: _jsx(Note, { children: empty }) });
108
+ // The time axis spans every series, so hiding one does not move the x axis
109
+ // under the reader; only the value axis rescales to what is shown.
110
+ const tMin = Math.min(...all);
111
+ const tMax = Math.max(...all);
112
+ const vMax = Math.max(...points.map((p) => p.v), 0);
113
+ const vMin = Math.min(...points.map((p) => p.v), 0);
114
+ const tSpan = tMax - tMin || 1;
115
+ const vSpan = vMax - vMin || 1;
116
+ const x = (t) => PAD_L + ((t - tMin) / tSpan) * (W - PAD_L);
117
+ const y = (val) => (H - PAD_B) - ((val - vMin) / vSpan) * (H - PAD_B - PAD_T);
118
+ const frac = (t) => (x(t) - PAD_L) / (W - PAD_L);
119
+ const timeAt = (fraction) => tMin + fraction * tSpan;
120
+ const gridValues = [vMin, vMin + vSpan / 2, vMax];
121
+ const fractionOf = (clientX) => {
122
+ const rect = svg.current?.getBoundingClientRect();
123
+ if (!rect)
124
+ return null;
125
+ const plotLeft = rect.left + (PAD_L / W) * rect.width;
126
+ const plotWidth = rect.width * (1 - PAD_L / W);
127
+ return Math.min(1, Math.max(0, (clientX - plotLeft) / plotWidth));
128
+ };
129
+ // The nearest sample per series to the hovered instant.
130
+ const hovered = hoverX === null ? null : (() => {
131
+ const t = timeAt(hoverX);
132
+ const rows = shown.map((s) => {
133
+ let best = null;
134
+ for (const p of s.points)
135
+ if (!best || Math.abs(p.t - t) < Math.abs(best.t - t))
136
+ best = p;
137
+ return best ? { name: s.name, i: series.indexOf(s), v: best.v, t: best.t } : null;
138
+ }).filter((r) => r !== null);
139
+ return rows.length ? { t, rows } : null;
140
+ })();
141
+ const toggle = (name) => setHidden((prev) => {
142
+ const next = new Set(prev);
143
+ if (next.has(name))
144
+ next.delete(name);
145
+ else
146
+ next.add(name);
147
+ // Hiding everything leaves a chart with no axis to read; treat the last
148
+ // one as "show all again".
149
+ return next.size === series.length ? new Set() : next;
150
+ });
151
+ return (_jsxs(Wrap, { children: [_jsxs(Plot, { children: [_jsxs(Svg, { ref: svg, viewBox: `0 0 ${W} ${H}`, preserveAspectRatio: "none", role: "img", "aria-label": label, onMouseMove: (e) => { const f = fractionOf(e.clientX); if (f === null)
152
+ return; setHoverX(f); setDrag((d) => (d ? { ...d, to: f } : null)); }, onMouseLeave: () => { setHoverX(null); setDrag(null); }, onMouseDown: (e) => { if (!onZoom)
153
+ return; const f = fractionOf(e.clientX); if (f !== null)
154
+ setDrag({ from: f, to: f }); }, onMouseUp: () => {
155
+ if (drag && onZoom)
156
+ onZoom(new Date(timeAt(Math.min(drag.from, drag.to))), new Date(timeAt(Math.max(drag.from, drag.to))));
157
+ setDrag(null);
158
+ }, children: [gridValues.map((g) => (_jsxs("g", { children: [_jsx("line", { x1: PAD_L, x2: W, y1: y(g), y2: y(g), stroke: v.line, strokeWidth: 1, vectorEffect: "non-scaling-stroke" }), _jsx("text", { x: PAD_L - 6, y: y(g) + 3, textAnchor: "end", fontSize: 9, fill: v.faint, children: tickValue(g) })] }, g))), _jsx("text", { x: PAD_L, y: H - 4, fontSize: 9, fill: v.faint, children: hhmm(tMin) }), _jsx("text", { x: W, y: H - 4, fontSize: 9, fill: v.faint, textAnchor: "end", children: hhmm(tMax) }), shown.map((s) => {
159
+ const i = series.indexOf(s);
160
+ const d = s.points.map((p, j) => `${j === 0 ? "M" : "L"} ${x(p.t)} ${y(p.v)}`).join(" ");
161
+ return _jsx("path", { d: d, fill: "none", stroke: STROKES[i % STROKES.length], strokeWidth: 1.5, vectorEffect: "non-scaling-stroke" }, s.name);
162
+ }), drag && Math.abs(drag.to - drag.from) > 0.002 ? (_jsx("rect", { x: PAD_L + Math.min(drag.from, drag.to) * (W - PAD_L), width: Math.abs(drag.to - drag.from) * (W - PAD_L), y: PAD_T, height: H - PAD_B - PAD_T, fill: v.brand12, stroke: v.brand55, strokeWidth: 1, vectorEffect: "non-scaling-stroke" })) : null, hoverX !== null && !drag ? (_jsx("line", { x1: PAD_L + hoverX * (W - PAD_L), x2: PAD_L + hoverX * (W - PAD_L), y1: PAD_T, y2: H - PAD_B, stroke: v.line2, strokeWidth: 1, vectorEffect: "non-scaling-stroke" })) : null, hovered && !drag ? hovered.rows.map((r) => _jsx("circle", { cx: x(r.t), cy: y(r.v), r: 2.5, fill: STROKES[r.i % STROKES.length] }, r.name)) : null] }), hovered && !drag ? (_jsxs(Tip, { "$left": frac(hovered.t) * 100, "$flip": frac(hovered.t) > 0.6, children: [_jsx("div", { className: "t", children: new Date(hovered.t).toLocaleString() }), hovered.rows.map((r) => _jsxs(TipRow, { "$i": r.i, children: [r.name, _jsx("span", { className: "val", children: tickValue(r.v) })] }, r.name))] })) : null] }), _jsx(Legend, { children: series.map((s, i) => (_jsx(Key, { type: "button", "$i": i, "$off": hidden.has(s.name), onClick: () => toggle(s.name), title: hidden.has(s.name) ? "Show this series" : "Hide this series", children: s.name }, s.name))) }), onZoom ? _jsx(ChartHint, { children: "Drag across the chart to zoom into a window." }) : null] }));
163
+ }
164
+ //# sourceMappingURL=Charts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Charts.js","sourceRoot":"","sources":["../../src/kit/Charts.tsx"],"names":[],"mappings":"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"}
@@ -8,7 +8,7 @@ export interface Column<T> {
8
8
  /** hide below this viewport width (px) */
9
9
  hideBelow?: number | undefined;
10
10
  }
11
- export declare function DataTable<T>({ columns, rows, rowKey, loading, skeletonRows, empty, rowHref, onRowClick, severity, footer, variant, hideHead }: {
11
+ export declare function DataTable<T>({ columns, rows, rowKey, loading, skeletonRows, empty, rowHref, onRowClick, severity, footer, variant, hideHead, detail }: {
12
12
  columns: Column<T>[];
13
13
  rows: T[] | undefined;
14
14
  rowKey: (row: T) => string;
@@ -23,5 +23,7 @@ export declare function DataTable<T>({ columns, rows, rowKey, loading, skeletonR
23
23
  variant?: "panel" | "bare" | undefined;
24
24
  /** omit the header row (short bare lists whose columns are self-evident) */
25
25
  hideHead?: boolean | undefined;
26
+ /** an expanded row under this one (a log line's attributes); null/undefined for none — the caller keeps the open state */
27
+ detail?: ((row: T) => ReactNode) | undefined;
26
28
  }): import("react").JSX.Element;
27
29
  //# sourceMappingURL=DataTable.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"DataTable.d.ts","sourceRoot":"","sources":["../../src/kit/DataTable.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAOjD,MAAM,WAAW,MAAM,CAAC,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,SAAS,CAAC;IAChB,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,SAAS,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IACrC,0CAA0C;IAC1C,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC;AAsDD,wBAAgB,SAAS,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,YAAgB,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE;IAClJ,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACrB,IAAI,EAAE,CAAC,EAAE,GAAG,SAAS,CAAC;IACtB,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,KAAK,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAC9B,OAAO,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,SAAS,CAAC;IAClD,UAAU,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC5C,QAAQ,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,SAAS,CAAC;IAC5D,MAAM,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAC/B,oFAAoF;IACpF,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;IACvC,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAChC,+BAgDA"}
1
+ {"version":3,"file":"DataTable.d.ts","sourceRoot":"","sources":["../../src/kit/DataTable.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAOjD,MAAM,WAAW,MAAM,CAAC,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,SAAS,CAAC;IAChB,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,SAAS,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IACrC,0CAA0C;IAC1C,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC;AA4DD,wBAAgB,SAAS,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,YAAgB,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE;IAC1J,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACrB,IAAI,EAAE,CAAC,EAAE,GAAG,SAAS,CAAC;IACtB,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,KAAK,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAC9B,OAAO,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,SAAS,CAAC;IAClD,UAAU,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC5C,QAAQ,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,SAAS,CAAC;IAC5D,MAAM,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAC/B,oFAAoF;IACpF,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;IACvC,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC/B,0HAA0H;IAC1H,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,SAAS,CAAC,GAAG,SAAS,CAAC;CAC9C,+BAmDA"}
@@ -50,7 +50,12 @@ const Bare = styled.div `
50
50
  table td { padding: 7px 12px; }
51
51
  table th { padding: 7px 12px; background: transparent; }
52
52
  `;
53
- export function DataTable({ columns, rows, rowKey, loading, skeletonRows = 5, empty, rowHref, onRowClick, severity, footer, variant, hideHead }) {
53
+ const DetailTd = styled.td `
54
+ padding: 12px 16px 16px;
55
+ background: ${v.surface2};
56
+ border-bottom: 1px solid ${v.line};
57
+ `;
58
+ export function DataTable({ columns, rows, rowKey, loading, skeletonRows = 5, empty, rowHref, onRowClick, severity, footer, variant, hideHead, detail }) {
54
59
  const navigate = useNavigate();
55
60
  const Wrap = variant === "bare" ? Bare : Panel;
56
61
  const showSkeleton = loading && (!rows || rows.length === 0);
@@ -58,7 +63,8 @@ export function DataTable({ columns, rows, rowKey, loading, skeletonRows = 5, em
58
63
  return (_jsxs(Wrap, { children: [_jsx(Scroll, { children: _jsxs(Table, { children: [hideHead ? null : (_jsx("thead", { children: _jsx("tr", { children: columns.map((c) => _jsx(Th, { "$align": c.align, "$hide": c.hideBelow, style: c.width ? { width: c.width } : undefined, children: c.head }, c.key)) }) })), !showSkeleton && !isEmpty ? (_jsx("tbody", { style: loading ? { opacity: 0.55 } : undefined, children: (rows ?? []).map((r) => {
59
64
  const href = rowHref?.(r) ?? null;
60
65
  const click = !!href || !!onRowClick;
61
- return (_jsx(Tr, { "$click": click, "$mark": severity?.(r) ?? null, onClick: click ? () => (href ? navigate(href) : onRowClick?.(r)) : undefined, children: columns.map((c) => _jsx(Td, { "$align": c.align, "$hide": c.hideBelow, children: c.render(r) }, c.key)) }, rowKey(r)));
66
+ const extra = detail?.(r);
67
+ return (_jsxs(Fragment, { children: [_jsx(Tr, { "$click": click, "$mark": severity?.(r) ?? null, onClick: click ? () => (href ? navigate(href) : onRowClick?.(r)) : undefined, children: columns.map((c) => _jsx(Td, { "$align": c.align, "$hide": c.hideBelow, children: c.render(r) }, c.key)) }), extra ? _jsx("tr", { children: _jsx(DetailTd, { colSpan: columns.length, children: extra }) }) : null] }, rowKey(r)));
62
68
  }) })) : null] }) }), showSkeleton ? (_jsx("div", { children: Array.from({ length: skeletonRows }).map((_, i) => (_jsxs(SkeletonRow, { children: [_jsx(Skeleton, { "$w": "26%" }), _jsx(Skeleton, { "$w": "12%" }), _jsx(Skeleton, { "$w": "8%" }), _jsx(Skeleton, { "$w": "16%" })] }, i))) })) : null, isEmpty ? _jsx(Fragment, { children: empty }) : null, footer && !showSkeleton && !isEmpty ? _jsx(FootRow, { children: footer }) : null] }));
63
69
  }
64
70
  //# sourceMappingURL=DataTable.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DataTable.js","sourceRoot":"","sources":["../../src/kit/DataTable.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DataTable.js","sourceRoot":"","sources":["../../src/kit/DataTable.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { type ReactNode } from "react";
2
+ export interface FacetOption {
3
+ value: string;
4
+ count: number | bigint;
5
+ /** 0..1 fraction of the total */
6
+ share: number;
7
+ }
8
+ /** compact count: 1234 → "1.2k" */
9
+ export declare function fmtCount(n: number | bigint): string;
10
+ /** share as a percentage: 0.0421 → "4.2%" */
11
+ export declare function fmtShare(share: number): string;
12
+ /**
13
+ * FacetSelect: a multi-select over the values a field takes, each with its
14
+ * count and share. Clearing from the chip is the common case once a filter is
15
+ * set, so the trailing × clears without opening the menu.
16
+ */
17
+ export declare function FacetSelect({ label, options, selected, onChange, loading, unavailable }: {
18
+ label: ReactNode;
19
+ options: FacetOption[];
20
+ selected: string[];
21
+ onChange: (values: string[]) => void;
22
+ loading?: boolean | undefined;
23
+ /**
24
+ * Why this field cannot be offered for what is being viewed. Distinct from
25
+ * having no options: "nothing matched" and "you cannot filter on this here"
26
+ * look identical in an empty menu, and only one is the user's to fix.
27
+ */
28
+ unavailable?: string | undefined;
29
+ }): import("react").JSX.Element;
30
+ /** RankList: ranked rows with a share bar behind each — "top events", "top clients". */
31
+ export declare function RankList({ items, onPick, empty, limit }: {
32
+ items: FacetOption[];
33
+ onPick?: ((value: string) => void) | undefined;
34
+ empty?: string | undefined;
35
+ limit?: number | undefined;
36
+ }): import("react").JSX.Element;
37
+ //# sourceMappingURL=Facet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Facet.d.ts","sourceRoot":"","sources":["../../src/kit/Facet.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA+B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AASpE,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,mCAAmC;AACnC,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAKnD;AAED,6CAA6C;AAC7C,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAG9C;AAsFD;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE;IACxF,KAAK,EAAE,SAAS,CAAC;IACjB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACrC,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAClC,+BAoDA;AAID,wFAAwF;AACxF,wBAAgB,QAAQ,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAA0B,EAAE,KAAK,EAAE,EAAE;IAC7E,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC/C,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B,+BAcA"}
@@ -0,0 +1,126 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useRef, useState } from "react";
3
+ import styled from "styled-components";
4
+ import { v } from "../theme/tokens.js";
5
+ import { Icon } from "./Icon.js";
6
+ /** compact count: 1234 → "1.2k" */
7
+ export function fmtCount(n) {
8
+ const x = typeof n === "bigint" ? Number(n) : n;
9
+ if (Math.abs(x) >= 1_000_000)
10
+ return `${(x / 1_000_000).toFixed(1)}M`;
11
+ if (Math.abs(x) >= 1_000)
12
+ return `${(x / 1_000).toFixed(1)}k`;
13
+ return String(x);
14
+ }
15
+ /** share as a percentage: 0.0421 → "4.2%" */
16
+ export function fmtShare(share) {
17
+ const pct = share * 100;
18
+ return pct >= 10 ? `${Math.round(pct)}%` : `${pct.toFixed(1)}%`;
19
+ }
20
+ const Wrap = styled.div `position: relative;`;
21
+ const Trigger = styled.button `
22
+ display: inline-flex;
23
+ align-items: center;
24
+ gap: 7px;
25
+ height: 30px;
26
+ padding: 0 11px;
27
+ border-radius: ${v.rCtl};
28
+ font-size: 12.5px;
29
+ font-weight: 500;
30
+ color: ${(p) => (p.$muted ? v.faint : v.text)};
31
+ background: ${(p) => (p.$active ? v.brand12 : v.field)};
32
+ border: 1px solid ${(p) => (p.$active ? v.brand55 : v.fieldLine)};
33
+ cursor: pointer;
34
+ white-space: nowrap;
35
+ &:hover { border-color: ${v.brand55}; }
36
+ &:focus-visible { outline: none; box-shadow: ${v.ring}; }
37
+ .n { color: ${v.muted}; font-size: 11.5px; font-variant-numeric: tabular-nums; }
38
+ .caret { font-size: 10px; opacity: 0.7; }
39
+ `;
40
+ const Menu = styled.div `
41
+ position: absolute;
42
+ top: calc(100% + 6px);
43
+ left: 0;
44
+ min-width: 260px;
45
+ max-height: 320px;
46
+ overflow-y: auto;
47
+ background: ${v.surface2};
48
+ border: 1px solid ${v.line2};
49
+ border-radius: ${v.rCard};
50
+ box-shadow: ${v.elev};
51
+ z-index: ${v.zPop};
52
+ padding: 5px;
53
+ `;
54
+ // The share bar sits behind the row rather than beside it: it turns the list
55
+ // into a distribution at a glance without costing a column.
56
+ const RankRow = styled.label `
57
+ position: relative;
58
+ display: flex;
59
+ align-items: center;
60
+ gap: 9px;
61
+ padding: 7px 9px;
62
+ border-radius: ${v.rCtl};
63
+ font-size: 12.5px;
64
+ color: ${v.text};
65
+ overflow: hidden;
66
+ ${(p) => p.$click && `cursor: pointer; &:hover { background: ${v.hover}; }`}
67
+ input { position: relative; }
68
+ `;
69
+ const Bar = styled.span `
70
+ position: absolute;
71
+ inset: 0 auto 0 0;
72
+ width: ${(p) => Math.max(2, p.$share * 100)}%;
73
+ background: ${v.brand08};
74
+ pointer-events: none;
75
+ `;
76
+ const Label = styled.span `
77
+ position: relative;
78
+ flex: 1;
79
+ overflow: hidden;
80
+ text-overflow: ellipsis;
81
+ white-space: nowrap;
82
+ `;
83
+ const Meta = styled.span `
84
+ position: relative;
85
+ color: ${v.faint};
86
+ font-size: 11px;
87
+ font-variant-numeric: tabular-nums;
88
+ white-space: nowrap;
89
+ `;
90
+ const Note = styled.div `
91
+ padding: 12px;
92
+ color: ${v.faint};
93
+ font-size: 12px;
94
+ text-align: center;
95
+ `;
96
+ /**
97
+ * FacetSelect: a multi-select over the values a field takes, each with its
98
+ * count and share. Clearing from the chip is the common case once a filter is
99
+ * set, so the trailing × clears without opening the menu.
100
+ */
101
+ export function FacetSelect({ label, options, selected, onChange, loading, unavailable }) {
102
+ const [open, setOpen] = useState(false);
103
+ const wrap = useRef(null);
104
+ useEffect(() => {
105
+ if (!open)
106
+ return;
107
+ const onDown = (e) => {
108
+ if (wrap.current && !wrap.current.contains(e.target))
109
+ setOpen(false);
110
+ };
111
+ document.addEventListener("mousedown", onDown);
112
+ return () => document.removeEventListener("mousedown", onDown);
113
+ }, [open]);
114
+ const toggle = (val) => onChange(selected.includes(val) ? selected.filter((s) => s !== val) : [...selected, val]);
115
+ const active = selected.length > 0;
116
+ return (_jsxs(Wrap, { ref: wrap, children: [_jsxs(Trigger, { type: "button", "$active": active, "$muted": !!unavailable, title: unavailable, "aria-expanded": open, onClick: () => setOpen((o) => !o), children: [label, active ? _jsx("span", { className: "n", children: selected.length }) : null, active ? (_jsx("span", { className: "caret", role: "button", "aria-label": "Clear", onClick: (e) => { e.stopPropagation(); onChange([]); setOpen(false); }, children: _jsx(Icon, { name: "close" }) })) : (_jsx("span", { className: "caret", children: _jsx(Icon, { name: "chevron-down" }) }))] }), open ? (_jsxs(Menu, { role: "listbox", "aria-multiselectable": "true", children: [loading ? _jsx(Note, { children: "Loading\u2026" }) : null, !loading && unavailable ? _jsx(Note, { children: unavailable }) : null, !loading && !unavailable && options.length === 0 ? _jsx(Note, { children: "No values in range" }) : null, options.map((o) => (_jsxs(RankRow, { "$click": true, children: [_jsx(Bar, { "$share": o.share }), _jsx("input", { type: "checkbox", checked: selected.includes(o.value), onChange: () => toggle(o.value) }), _jsx(Label, { title: o.value, children: o.value || "(empty)" }), _jsxs(Meta, { children: [fmtCount(o.count), " \u00B7 ", fmtShare(o.share)] })] }, o.value)))] })) : null] }));
117
+ }
118
+ const RankWrap = styled.div `display: flex; flex-direction: column; gap: 1px;`;
119
+ /** RankList: ranked rows with a share bar behind each — "top events", "top clients". */
120
+ export function RankList({ items, onPick, empty = "Nothing in range", limit }) {
121
+ const rows = limit ? items.slice(0, limit) : items;
122
+ if (rows.length === 0)
123
+ return _jsx(Note, { children: empty });
124
+ return (_jsx(RankWrap, { children: rows.map((o) => (_jsxs(RankRow, { as: onPick ? "button" : "div", "$click": !!onPick, onClick: onPick ? () => onPick(o.value) : undefined, children: [_jsx(Bar, { "$share": o.share }), _jsx(Label, { title: o.value, children: o.value || "(empty)" }), _jsxs(Meta, { children: [fmtCount(o.count), " \u00B7 ", fmtShare(o.share)] })] }, o.value))) }));
125
+ }
126
+ //# sourceMappingURL=Facet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Facet.js","sourceRoot":"","sources":["../../src/kit/Facet.tsx"],"names":[],"mappings":"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"}
@@ -75,4 +75,12 @@ export declare const FormActions: import("styled-components/dist/types").IStyled
75
75
  export declare const InlineError: import("styled-components/dist/types").IStyledComponentBase<"web", Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "style"> & {
76
76
  style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
77
77
  }> & string;
78
+ export declare function CheckRow({ checked, onChange, label, desc, nested, disabled }: {
79
+ checked: boolean;
80
+ onChange: (c: boolean) => void;
81
+ label: ReactNode;
82
+ desc?: ReactNode | undefined;
83
+ nested?: boolean | undefined;
84
+ disabled?: boolean | undefined;
85
+ }): import("react").JSX.Element;
78
86
  //# sourceMappingURL=Form.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Form.d.ts","sourceRoot":"","sources":["../../src/kit/Form.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Form.d.ts","sourceRoot":"","sources":["../../src/kit/Form.tsx"],"names":[],"mappings":"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"}