basalt-ui 1.22.0 → 1.23.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +29 -12
- package/CHANGELOG.md +28 -0
- package/MIGRATING.md +207 -12
- package/README.md +74 -21
- package/agent/rules/basalt-app.md +33 -3
- package/agent/rules/basalt-charts.md +78 -7
- package/agent/rules/basalt-content.md +3 -3
- package/agent/rules/basalt-mantine.md +4 -4
- package/agent/rules/basalt-tokens.md +35 -6
- package/agent/skills/basalt-app/SKILL.md +25 -12
- package/agent/skills/basalt-charts/SKILL.md +27 -10
- package/agent/templates/CLAUDE-block.md.tpl +3 -2
- package/agent/templates/DESIGN.md.tpl +3 -1
- package/configs/oxlint-plugin.js +49 -8
- package/configs/oxlint-plugin.test.ts +88 -31
- package/dist/charts/hooks/useBandPlot.d.ts +138 -0
- package/dist/charts/hooks/useBandPlot.d.ts.map +1 -0
- package/dist/charts/hooks/useBandPlot.js +127 -0
- package/dist/charts/index.d.ts +4 -0
- package/dist/charts/index.d.ts.map +1 -1
- package/dist/charts/index.js +14 -0
- package/dist/charts/kinds/BandStrip.d.ts +127 -0
- package/dist/charts/kinds/BandStrip.d.ts.map +1 -0
- package/dist/charts/kinds/BandStrip.js +271 -0
- package/dist/charts/kinds/BandStrip.test.d.ts +2 -0
- package/dist/charts/kinds/BandStrip.test.d.ts.map +1 -0
- package/dist/charts/kinds/Bars.d.ts +5 -1
- package/dist/charts/kinds/Bars.d.ts.map +1 -1
- package/dist/charts/kinds/Bars.js +2 -0
- package/dist/charts/kinds/MirroredBars.d.ts +95 -0
- package/dist/charts/kinds/MirroredBars.d.ts.map +1 -0
- package/dist/charts/kinds/MirroredBars.js +328 -0
- package/dist/charts/kinds/MirroredBars.test.d.ts +2 -0
- package/dist/charts/kinds/MirroredBars.test.d.ts.map +1 -0
- package/dist/charts/kinds/MultiLine.d.ts +5 -1
- package/dist/charts/kinds/MultiLine.d.ts.map +1 -1
- package/dist/charts/kinds/MultiLine.js +2 -0
- package/dist/charts/kinds/StackedArea.d.ts +5 -1
- package/dist/charts/kinds/StackedArea.d.ts.map +1 -1
- package/dist/charts/kinds/StackedArea.js +2 -0
- package/dist/charts/kinds/ZonedLine.d.ts +5 -1
- package/dist/charts/kinds/ZonedLine.d.ts.map +1 -1
- package/dist/charts/kinds/ZonedLine.js +2 -0
- package/dist/charts/primitives/CartesianChart.d.ts +18 -2
- package/dist/charts/primitives/CartesianChart.d.ts.map +1 -1
- package/dist/charts/primitives/CartesianChart.js +5 -2
- package/dist/charts/primitives/HatchPattern.d.ts +31 -0
- package/dist/charts/primitives/HatchPattern.d.ts.map +1 -0
- package/dist/charts/primitives/HatchPattern.js +31 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +228 -31
- package/dist/cli/shipped-versions.test.d.ts +2 -0
- package/dist/cli/shipped-versions.test.d.ts.map +1 -0
- package/dist/guard/index.d.ts.map +1 -1
- package/dist/guard/index.js +60 -13
- package/dist/vite.d.ts +42 -3
- package/dist/vite.d.ts.map +1 -1
- package/dist/vite.js +67 -30
- package/llms.txt +2 -2
- package/package.json +1 -1
- package/src/charts/hooks/useBandPlot.ts +302 -0
- package/src/charts/index.ts +14 -0
- package/src/charts/kinds/BandStrip.test.tsx +282 -0
- package/src/charts/kinds/BandStrip.tsx +457 -0
- package/src/charts/kinds/Bars.tsx +7 -1
- package/src/charts/kinds/DualPanel.test.tsx +10 -4
- package/src/charts/kinds/MirroredBars.test.tsx +232 -0
- package/src/charts/kinds/MirroredBars.tsx +491 -0
- package/src/charts/kinds/MultiLine.tsx +7 -1
- package/src/charts/kinds/StackedArea.tsx +7 -1
- package/src/charts/kinds/ZonedLine.tsx +7 -1
- package/src/charts/primitives/CartesianChart.test.tsx +86 -4
- package/src/charts/primitives/CartesianChart.tsx +28 -3
- package/src/charts/primitives/HatchPattern.tsx +55 -0
- package/src/cli/help.test.ts +74 -1
- package/src/cli/index.ts +436 -52
- package/src/cli/shipped-versions.test.ts +83 -0
- package/src/cli/tokens-css.test.ts +62 -0
- package/src/cli/toolchain-wiring.test.ts +171 -4
- package/src/cli/waiver-audit.test.ts +7 -3
- package/src/guard/check-source.test.ts +211 -42
- package/src/guard/index.ts +149 -23
- package/src/vite.test.ts +79 -0
- package/src/vite.ts +141 -39
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BandStrip.d.ts","sourceRoot":"","sources":["../../../src/charts/kinds/BandStrip.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAEzD,OAAO,KAAK,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAYvE,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAG/D;;;GAGG;AACH,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI,WAAW,GAAG;IAC7C;;;;;;;;;OASG;IACH,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,GAAG,IAAI,CAAA;CACtC,CAAA;AAED,0FAA0F;AAC1F,MAAM,MAAM,QAAQ,GAAG;IACrB;;;;;;;;;OASG;IACH,KAAK,EAAE,MAAM,CAAA;IACb;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;IACb;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB;;;;OAIG;IACH,MAAM,CAAC,EAAE;QACP,iFAAiF;QACjF,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,uEAAuE;QACvE,KAAK,CAAC,EAAE,MAAM,CAAA;KACf,CAAA;CACF,CAAA;AAED,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI;IAC9B,IAAI,EAAE,SAAS,CAAC,EAAE,CAAA;IAClB,gEAAgE;IAChE,OAAO,EAAE,MAAM,CAAA;IACf;yFACqF;IACrF,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,CAAA;IACtB;sCACkC;IAClC,MAAM,EAAE,SAAS,eAAe,CAAC,CAAC,CAAC,EAAE,CAAA;IACrC,oCAAoC;IACpC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,QAAQ,CAAA;IAC3B;kEAC8D;IAC9D,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,+EAA+E;IAC/E,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,6DAA6D;IAC7D,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAA;IACjC,mDAAmD;IACnD,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,KAAK,SAAS,MAAM,EAAE,CAAA;IAC/E,4EAA4E;IAC5E,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAA;IAClB;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;IACnC,OAAO,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,KAAK,CAAA;IACtC,MAAM,CAAC,EAAE,iBAAiB,GAAG,KAAK,CAAA;IAClC;;;wEAGoE;IACpE,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,iEAAiE;IACjE,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAA;IAC7B;iDAC6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,8DAA8D;IAC9D,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB,CAAA;AAkDD;;;;;;;;;;;;;GAaG;AACH,iBAAS,cAAc,CAAC,CAAC,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,+BAgBlD;AAwPD;;;GAGG;AACH,eAAO,MAAM,SAAS,EAA2B,OAAO,cAAc,CAAA"}
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Group } from "@visx/group";
|
|
3
|
+
import { memo, useMemo } from "react";
|
|
4
|
+
import { VX, alpha } from "../../tokens/index.js";
|
|
5
|
+
import { useBandPlot } from "../hooks/useBandPlot.js";
|
|
6
|
+
import { AxisBottomDate } from "../primitives/Axes.js";
|
|
7
|
+
import { ChartFrame, resolveLegend } from "../primitives/ChartFrame.js";
|
|
8
|
+
import {
|
|
9
|
+
ChartTooltipFloat,
|
|
10
|
+
TooltipBody,
|
|
11
|
+
TooltipHeader,
|
|
12
|
+
TooltipRow
|
|
13
|
+
} from "../primitives/ChartTooltip.js";
|
|
14
|
+
import { Crosshair } from "../primitives/Crosshair.js";
|
|
15
|
+
import { HatchPattern, hatchFill, hatchSizeFor } from "../primitives/HatchPattern.js";
|
|
16
|
+
import { HoverOverlay } from "../primitives/HoverOverlay.js";
|
|
17
|
+
import { fmtAxisDate } from "../utils/format.js";
|
|
18
|
+
const DEFAULT_MARKER_INSET = 6;
|
|
19
|
+
const NO_READING = "\u2014";
|
|
20
|
+
const UNKNOWN_MARK = {
|
|
21
|
+
fill: alpha(VX.neutral, 0.2),
|
|
22
|
+
stroke: VX.neutral,
|
|
23
|
+
strokeWidth: 1,
|
|
24
|
+
strokeDasharray: "3 2"
|
|
25
|
+
};
|
|
26
|
+
function isDev() {
|
|
27
|
+
return process.env["NODE_ENV"] !== "production";
|
|
28
|
+
}
|
|
29
|
+
function unknownStateError(what, key, known) {
|
|
30
|
+
return new Error(
|
|
31
|
+
`BandStrip: ${what} "${key}" names no \`series\` entry (known: ${[...known].join(", ")}) \u2014 so it has no legend entry, no colour and no tooltip row. Add the state to \`series\`, or map the datum onto one that is there.`
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
function formatBandValue(style, datum) {
|
|
35
|
+
if (style.formatValue === void 0) return "";
|
|
36
|
+
return style.formatValue(datum) ?? NO_READING;
|
|
37
|
+
}
|
|
38
|
+
function BandStripInner(props) {
|
|
39
|
+
const { series, chartId, height, fill, legend, ariaLabel, isPending } = props;
|
|
40
|
+
return /* @__PURE__ */ jsx(
|
|
41
|
+
ChartFrame,
|
|
42
|
+
{
|
|
43
|
+
series,
|
|
44
|
+
chartId,
|
|
45
|
+
...height !== void 0 && { height },
|
|
46
|
+
...fill !== void 0 && { fill },
|
|
47
|
+
...ariaLabel !== void 0 && { ariaLabel },
|
|
48
|
+
...isPending !== void 0 && { isPending },
|
|
49
|
+
legend: resolveLegend(legend),
|
|
50
|
+
children: (plot) => /* @__PURE__ */ jsx(BandStripPlot, { ...props, plot })
|
|
51
|
+
}
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
function BandStripPlot(props) {
|
|
55
|
+
const {
|
|
56
|
+
data,
|
|
57
|
+
chartId,
|
|
58
|
+
getX,
|
|
59
|
+
series,
|
|
60
|
+
getBand,
|
|
61
|
+
formatX = fmtAxisDate,
|
|
62
|
+
xTickValues,
|
|
63
|
+
fold,
|
|
64
|
+
cursorResolution = "leading",
|
|
65
|
+
tooltip,
|
|
66
|
+
absentState,
|
|
67
|
+
margin: marginOverride,
|
|
68
|
+
ariaLabel,
|
|
69
|
+
plot
|
|
70
|
+
} = props;
|
|
71
|
+
const { hidden } = plot;
|
|
72
|
+
const styleByKey = useMemo(() => new Map(series.map((s) => [s.key, s])), [series]);
|
|
73
|
+
const band = useBandPlot({
|
|
74
|
+
data,
|
|
75
|
+
chartId,
|
|
76
|
+
getX,
|
|
77
|
+
formatX,
|
|
78
|
+
width: plot.width,
|
|
79
|
+
cursorResolution,
|
|
80
|
+
...fold !== void 0 && { fold },
|
|
81
|
+
...xTickValues !== void 0 && { xTickValues },
|
|
82
|
+
...marginOverride !== void 0 && { margin: marginOverride },
|
|
83
|
+
...tooltip !== void 0 && { tooltip }
|
|
84
|
+
});
|
|
85
|
+
const { bands, margin, plotWidth, scale, cursor, point, crosshairX, step, bandWidth } = band;
|
|
86
|
+
const stripHeight = Math.max(plot.height - margin.top - margin.bottom, 1);
|
|
87
|
+
const hatchId = `${chartId}-band-absent`;
|
|
88
|
+
if (absentState !== void 0 && !styleByKey.has(absentState)) {
|
|
89
|
+
throw unknownStateError("absentState", absentState, styleByKey.keys());
|
|
90
|
+
}
|
|
91
|
+
const absentColor = (absentState === void 0 ? void 0 : styleByKey.get(absentState)?.color) ?? VX.neutral;
|
|
92
|
+
const rects = useMemo(() => {
|
|
93
|
+
const out = [];
|
|
94
|
+
bands.forEach((d, i) => {
|
|
95
|
+
const span = getBand(d);
|
|
96
|
+
const style = styleByKey.get(span.state);
|
|
97
|
+
const x = i * step;
|
|
98
|
+
if (style === void 0) {
|
|
99
|
+
if (isDev()) throw unknownStateError("BandSpan.state", span.state, styleByKey.keys());
|
|
100
|
+
out.push(
|
|
101
|
+
/* @__PURE__ */ jsx(
|
|
102
|
+
"rect",
|
|
103
|
+
{
|
|
104
|
+
...UNKNOWN_MARK,
|
|
105
|
+
x,
|
|
106
|
+
y: 0,
|
|
107
|
+
width: bandWidth,
|
|
108
|
+
height: stripHeight,
|
|
109
|
+
rx: 1,
|
|
110
|
+
pointerEvents: "none"
|
|
111
|
+
},
|
|
112
|
+
getX(d)
|
|
113
|
+
)
|
|
114
|
+
);
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
if (hidden.has(span.state)) return;
|
|
118
|
+
const absent = clampFraction(span.absentFraction);
|
|
119
|
+
const measuredWidth = bandWidth * (1 - absent);
|
|
120
|
+
const hatchWidth = bandWidth - measuredWidth;
|
|
121
|
+
const markerKey = span.marker?.state ?? span.state;
|
|
122
|
+
const markerColor = styleByKey.get(markerKey)?.color;
|
|
123
|
+
if (span.marker !== void 0 && markerColor === void 0 && isDev()) {
|
|
124
|
+
throw unknownStateError("BandSpan.marker.state", markerKey, styleByKey.keys());
|
|
125
|
+
}
|
|
126
|
+
const inset = span.marker?.inset ?? DEFAULT_MARKER_INSET;
|
|
127
|
+
out.push(
|
|
128
|
+
/* @__PURE__ */ jsxs("g", { children: [
|
|
129
|
+
measuredWidth > 0 && /* @__PURE__ */ jsx(
|
|
130
|
+
"rect",
|
|
131
|
+
{
|
|
132
|
+
x,
|
|
133
|
+
y: 0,
|
|
134
|
+
width: measuredWidth,
|
|
135
|
+
height: stripHeight,
|
|
136
|
+
rx: 1,
|
|
137
|
+
fill: span.fill ?? alpha(style.color, style.fillOpacity ?? 1),
|
|
138
|
+
pointerEvents: "none"
|
|
139
|
+
}
|
|
140
|
+
),
|
|
141
|
+
hatchWidth > 0 && /* @__PURE__ */ jsx(
|
|
142
|
+
"rect",
|
|
143
|
+
{
|
|
144
|
+
x: x + measuredWidth,
|
|
145
|
+
y: 0,
|
|
146
|
+
width: hatchWidth,
|
|
147
|
+
height: stripHeight,
|
|
148
|
+
rx: 1,
|
|
149
|
+
fill: hatchFill(hatchId),
|
|
150
|
+
pointerEvents: "none"
|
|
151
|
+
}
|
|
152
|
+
),
|
|
153
|
+
span.marker !== void 0 && measuredWidth > 0 && /* @__PURE__ */ jsx(
|
|
154
|
+
"rect",
|
|
155
|
+
{
|
|
156
|
+
...markerColor === void 0 ? UNKNOWN_MARK : { fill: markerColor },
|
|
157
|
+
x,
|
|
158
|
+
y: inset,
|
|
159
|
+
width: measuredWidth,
|
|
160
|
+
height: Math.max(stripHeight - 2 * inset, 2),
|
|
161
|
+
rx: 1,
|
|
162
|
+
pointerEvents: "none"
|
|
163
|
+
}
|
|
164
|
+
)
|
|
165
|
+
] }, getX(d))
|
|
166
|
+
);
|
|
167
|
+
});
|
|
168
|
+
return out;
|
|
169
|
+
}, [bands, getBand, getX, styleByKey, hidden, bandWidth, step, stripHeight, hatchId]);
|
|
170
|
+
if (plotWidth <= 0 || bands.length === 0) return null;
|
|
171
|
+
const cfg = tooltip === false ? void 0 : tooltip;
|
|
172
|
+
const badge = cfg?.label === void 0 || point === null ? null : cfg.label(point);
|
|
173
|
+
const row = point === null ? null : deriveBandRow(getBand(point), styleByKey, hidden, point);
|
|
174
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
175
|
+
/* @__PURE__ */ jsxs("svg", { ref: band.svgRef, width: plot.width, height: plot.height, children: [
|
|
176
|
+
/* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsx(
|
|
177
|
+
HatchPattern,
|
|
178
|
+
{
|
|
179
|
+
id: hatchId,
|
|
180
|
+
color: absentColor,
|
|
181
|
+
opacity: 0.7,
|
|
182
|
+
size: hatchSizeFor(bandWidth)
|
|
183
|
+
}
|
|
184
|
+
) }),
|
|
185
|
+
/* @__PURE__ */ jsxs(Group, { left: margin.left, top: margin.top, children: [
|
|
186
|
+
rects,
|
|
187
|
+
crosshairX !== null && /* @__PURE__ */ jsx(Crosshair, { x: crosshairX, top: 0, bottom: stripHeight }),
|
|
188
|
+
/* @__PURE__ */ jsx(
|
|
189
|
+
AxisBottomDate,
|
|
190
|
+
{
|
|
191
|
+
top: stripHeight,
|
|
192
|
+
scale,
|
|
193
|
+
tickValues: band.tickValues,
|
|
194
|
+
tickFormat: (v) => formatX(String(v))
|
|
195
|
+
}
|
|
196
|
+
),
|
|
197
|
+
/* @__PURE__ */ jsx(
|
|
198
|
+
HoverOverlay,
|
|
199
|
+
{
|
|
200
|
+
width: plotWidth,
|
|
201
|
+
height: stripHeight,
|
|
202
|
+
onMove: cursor.onPointerMove,
|
|
203
|
+
onLeave: cursor.onPointerLeave,
|
|
204
|
+
onKeyDown: cursor.onKeyDown,
|
|
205
|
+
onBlur: cursor.onBlur,
|
|
206
|
+
valueMax: Math.max(bands.length - 1, 0),
|
|
207
|
+
...point !== null && {
|
|
208
|
+
valueNow: bands.indexOf(point),
|
|
209
|
+
valueText: formatX(getX(point))
|
|
210
|
+
},
|
|
211
|
+
...ariaLabel !== void 0 && { ariaLabel }
|
|
212
|
+
}
|
|
213
|
+
)
|
|
214
|
+
] })
|
|
215
|
+
] }),
|
|
216
|
+
band.showTooltip && point !== null && /* @__PURE__ */ jsxs(ChartTooltipFloat, { anchor: band.tooltipAnchor, ariaLive: band.ariaLive, children: [
|
|
217
|
+
/* @__PURE__ */ jsx(
|
|
218
|
+
TooltipHeader,
|
|
219
|
+
{
|
|
220
|
+
date: getX(point),
|
|
221
|
+
...cfg?.formatHeader !== void 0 && {
|
|
222
|
+
format: (key) => cfg.formatHeader?.(key, point) ?? key
|
|
223
|
+
},
|
|
224
|
+
...badge !== null && { label: badge.text, labelColor: badge.color }
|
|
225
|
+
}
|
|
226
|
+
),
|
|
227
|
+
/* @__PURE__ */ jsxs(TooltipBody, { children: [
|
|
228
|
+
cfg?.prependRows?.(point, { hidden }),
|
|
229
|
+
row !== null && /* @__PURE__ */ jsx(
|
|
230
|
+
TooltipRow,
|
|
231
|
+
{
|
|
232
|
+
color: row.color,
|
|
233
|
+
label: row.label,
|
|
234
|
+
value: row.value,
|
|
235
|
+
shape: row.shape,
|
|
236
|
+
dashed: row.dashed
|
|
237
|
+
}
|
|
238
|
+
),
|
|
239
|
+
cfg?.extraRows?.(point, { hidden })
|
|
240
|
+
] })
|
|
241
|
+
] })
|
|
242
|
+
] });
|
|
243
|
+
}
|
|
244
|
+
function clampFraction(value) {
|
|
245
|
+
if (value === void 0 || !Number.isFinite(value)) return 0;
|
|
246
|
+
return Math.min(Math.max(value, 0), 1);
|
|
247
|
+
}
|
|
248
|
+
function deriveBandRow(span, styleByKey, hidden, datum) {
|
|
249
|
+
const style = styleByKey.get(span.state);
|
|
250
|
+
if (style === void 0) {
|
|
251
|
+
return {
|
|
252
|
+
color: VX.neutral,
|
|
253
|
+
label: "Unknown state",
|
|
254
|
+
value: span.state,
|
|
255
|
+
shape: "bar",
|
|
256
|
+
dashed: true
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
if (style.tooltip === false || hidden.has(span.state)) return null;
|
|
260
|
+
return {
|
|
261
|
+
color: style.color,
|
|
262
|
+
label: style.label,
|
|
263
|
+
value: formatBandValue(style, datum),
|
|
264
|
+
shape: style.mark === "line" ? "line" : "bar",
|
|
265
|
+
dashed: style.dash === "dashed"
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
const BandStrip = memo(BandStripInner);
|
|
269
|
+
export {
|
|
270
|
+
BandStrip
|
|
271
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BandStrip.test.d.ts","sourceRoot":"","sources":["../../../src/charts/kinds/BandStrip.test.tsx"],"names":[],"mappings":""}
|
|
@@ -87,8 +87,12 @@ export type BarsProps<T> = {
|
|
|
87
87
|
barLayout?: 'stacked' | 'grouped';
|
|
88
88
|
/** Per-bar opacity override. Receives the data point + bar key. Default 0.85. */
|
|
89
89
|
barOpacity?: (d: T, key: string) => number;
|
|
90
|
-
/**
|
|
90
|
+
/** Exact number of x ticks. Default: as many as fit. Ignored when `xTickValues` is set. */
|
|
91
91
|
xTicks?: number;
|
|
92
|
+
/** Which domain keys get a tick, from the full key list and the resolved plot width. Takes
|
|
93
|
+
* precedence over `xTicks` — see `CartesianChartProps.xTickValues` for why a count is not
|
|
94
|
+
* always enough. */
|
|
95
|
+
xTickValues?: (keys: readonly string[], xMax: number) => readonly string[];
|
|
92
96
|
/** X tick label formatter. Default `fmtAxisDate` (DD.MM). */
|
|
93
97
|
formatX?: (key: string) => string;
|
|
94
98
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Bars.d.ts","sourceRoot":"","sources":["../../../src/charts/kinds/Bars.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"Bars.d.ts","sourceRoot":"","sources":["../../../src/charts/kinds/Bars.tsx"],"names":[],"mappings":"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"}
|
|
@@ -24,6 +24,7 @@ function BarsInner(props) {
|
|
|
24
24
|
barLayout = "stacked",
|
|
25
25
|
barOpacity,
|
|
26
26
|
xTicks,
|
|
27
|
+
xTickValues,
|
|
27
28
|
formatX,
|
|
28
29
|
cursorResolution,
|
|
29
30
|
tooltip,
|
|
@@ -128,6 +129,7 @@ function BarsInner(props) {
|
|
|
128
129
|
y: yConfig,
|
|
129
130
|
...y2 !== void 0 && { y2 },
|
|
130
131
|
...xTicks !== void 0 && { xTicks },
|
|
132
|
+
...xTickValues !== void 0 && { xTickValues },
|
|
131
133
|
...formatX !== void 0 && { formatX },
|
|
132
134
|
...cursorResolution !== void 0 && { cursorResolution },
|
|
133
135
|
...zones !== void 0 && { zones },
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import type { ChartMargin } from '../../tokens/index.js';
|
|
2
|
+
import type { CursorResolution } from '../cursor/resolve.js';
|
|
3
|
+
import type { BandFold, BandTooltipConfig } from '../hooks/useBandPlot.js';
|
|
4
|
+
import type { ChartLegendConfig, ChartSeries } from '../series.js';
|
|
5
|
+
/** One of the two panes. Each resolves its own domain — that is the whole point of the kind. */
|
|
6
|
+
export type MirroredBarPane = {
|
|
7
|
+
/** Key of the `series` entry this pane draws: its colour, its legend entry, its tooltip row.
|
|
8
|
+
* A key naming no entry throws — see {@link assertPaneKey}. */
|
|
9
|
+
key: string;
|
|
10
|
+
/**
|
|
11
|
+
* The pane's upper bound. `'auto'` (default) is its own visible maximum; a number pins it.
|
|
12
|
+
*
|
|
13
|
+
* A pane has no LOWER bound to configure — a mirrored bar's length is its magnitude measured
|
|
14
|
+
* from the shared baseline, so the pane's zero IS the baseline. That is also why the two panes
|
|
15
|
+
* never share a domain: an upload an order of magnitude below its download flattens to a line
|
|
16
|
+
* along the baseline on a shared scale, and it is the half that explains a stalled call.
|
|
17
|
+
*/
|
|
18
|
+
max?: number | 'auto';
|
|
19
|
+
/** When `max` is `'auto'`: floors the upper bound, so a quiet window doesn't amplify noise to
|
|
20
|
+
* full height. */
|
|
21
|
+
autoMaxFloor?: number;
|
|
22
|
+
/** Tick count for this pane's own axis. Default 3. */
|
|
23
|
+
ticks?: number;
|
|
24
|
+
/** Tick + tooltip formatter for this pane. A pane's axis is in its OWN units — one shared
|
|
25
|
+
* formatter would be wrong for at least one of them whenever the two differ. */
|
|
26
|
+
format: (v: number) => string;
|
|
27
|
+
};
|
|
28
|
+
export type MirroredBarsProps<T> = {
|
|
29
|
+
data: readonly T[];
|
|
30
|
+
chartId: string;
|
|
31
|
+
/** Extracts the x-domain key — a slot start, hence the `'leading'` cursor default. */
|
|
32
|
+
getX: (d: T) => string;
|
|
33
|
+
/**
|
|
34
|
+
* The single source of truth for bar colours, legend entries and tooltip rows. `up.key` and
|
|
35
|
+
* `down.key` name two of these; any further entry is legend-only (give it `getValue: () => null`)
|
|
36
|
+
* — which is how ABSENCE gets named, and it has to be: a hatched bar is the one mark on this
|
|
37
|
+
* chart a reader cannot decode from either axis.
|
|
38
|
+
*/
|
|
39
|
+
series: readonly ChartSeries<T>[];
|
|
40
|
+
/** The pane drawn ABOVE the baseline. */
|
|
41
|
+
up: MirroredBarPane;
|
|
42
|
+
/** The pane drawn BELOW the baseline. */
|
|
43
|
+
down: MirroredBarPane;
|
|
44
|
+
/** The up pane's share of the bar band. Default 0.35 — the mirrored pair is usually asymmetric,
|
|
45
|
+
* and splitting evenly spends most of the chart on empty space above the smaller half. */
|
|
46
|
+
upFraction?: number;
|
|
47
|
+
/**
|
|
48
|
+
* 0..1 of this bar's width no source sample covers, hatched across the FULL band height.
|
|
49
|
+
*
|
|
50
|
+
* Full height, both panes, deliberately: a hatch drawn on one pane only reads as "that half
|
|
51
|
+
* measured zero", which is the measured-and-idle state absence must stay distinguishable from.
|
|
52
|
+
*/
|
|
53
|
+
getAbsentFraction?: (d: T) => number;
|
|
54
|
+
/** Per-datum bar opacity — a real but qualified measurement (a short bucket, a partial interval)
|
|
55
|
+
* drawn dimmer. Default 1. */
|
|
56
|
+
getBarOpacity?: (d: T) => number;
|
|
57
|
+
/** Fixed height in px, forwarded to `ChartFrame`. Default 240. */
|
|
58
|
+
height?: number;
|
|
59
|
+
fill?: boolean;
|
|
60
|
+
formatX?: (key: string) => string;
|
|
61
|
+
xTickValues?: (keys: readonly string[], plotWidth: number) => readonly string[];
|
|
62
|
+
fold?: BandFold<T>;
|
|
63
|
+
/** Default `'leading'` — see `BandStripProps.cursorResolution`. */
|
|
64
|
+
cursorResolution?: CursorResolution;
|
|
65
|
+
tooltip?: BandTooltipConfig<T> | false;
|
|
66
|
+
legend?: ChartLegendConfig | false;
|
|
67
|
+
/** Series key whose colour the absence hatch is drawn in. Default `VX.neutral`. A key naming no
|
|
68
|
+
* `series` entry throws rather than falling back to the unnamed default. */
|
|
69
|
+
absentState?: string;
|
|
70
|
+
margin?: Partial<ChartMargin>;
|
|
71
|
+
ariaLabel?: string;
|
|
72
|
+
isPending?: boolean;
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* Two bar panes over ONE x scale and one cursor, mirrored around a shared baseline, each in its
|
|
76
|
+
* own independent domain.
|
|
77
|
+
*
|
|
78
|
+
* **Why not `DualPanel`.** `DualPanel`'s two panes are a LINE pane and a signed-histogram pane: it
|
|
79
|
+
* requires `series` to be line series it draws with `LinePath`, and its bottom pane takes a single
|
|
80
|
+
* signed `getBar` over one symmetric `[-maxAbs, maxAbs]` scale. Neither half fits. Two independent
|
|
81
|
+
* magnitudes mirrored around a baseline are not one signed quantity — a 220 kB/s down and a 20 kB/s
|
|
82
|
+
* up are two readings, not `+220` and `−20` of one — and forcing them onto one scale is exactly the
|
|
83
|
+
* flattening this shape exists to avoid. Bending `DualPanel` to cover it would mean a
|
|
84
|
+
* `topMark: 'line' | 'bars'` switch, a second value accessor, and a per-pane domain law that
|
|
85
|
+
* contradicts its symmetric one: a fork of its internals wearing one name. It composes the same
|
|
86
|
+
* `useBandPlot` choreography instead, which is where the sharing actually belongs.
|
|
87
|
+
*/
|
|
88
|
+
declare function MirroredBarsInner<T>(props: MirroredBarsProps<T>): import("react").JSX.Element;
|
|
89
|
+
/**
|
|
90
|
+
* Hand-memoized: React Compiler does not process the shipped dist, so the hot kind is wrapped in
|
|
91
|
+
* `React.memo` to retain the auto-memoization it had as source (parity with `DualPanel`).
|
|
92
|
+
*/
|
|
93
|
+
export declare const MirroredBars: typeof MirroredBarsInner;
|
|
94
|
+
export {};
|
|
95
|
+
//# sourceMappingURL=MirroredBars.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MirroredBars.d.ts","sourceRoot":"","sources":["../../../src/charts/kinds/MirroredBars.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAEzD,OAAO,KAAK,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAcvE,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAG/D,gGAAgG;AAChG,MAAM,MAAM,eAAe,GAAG;IAC5B;mEAC+D;IAC/D,GAAG,EAAE,MAAM,CAAA;IACX;;;;;;;OAOG;IACH,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACrB;sBACkB;IAClB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,sDAAsD;IACtD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd;oFACgF;IAChF,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;CAC9B,CAAA;AAED,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAAI;IACjC,IAAI,EAAE,SAAS,CAAC,EAAE,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,sFAAsF;IACtF,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,CAAA;IACtB;;;;;OAKG;IACH,MAAM,EAAE,SAAS,WAAW,CAAC,CAAC,CAAC,EAAE,CAAA;IACjC,yCAAyC;IACzC,EAAE,EAAE,eAAe,CAAA;IACnB,yCAAyC;IACzC,IAAI,EAAE,eAAe,CAAA;IACrB;8FAC0F;IAC1F,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,CAAA;IACpC;kCAC8B;IAC9B,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,CAAA;IAChC,kEAAkE;IAClE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAA;IACjC,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,KAAK,SAAS,MAAM,EAAE,CAAA;IAC/E,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAA;IAClB,mEAAmE;IACnE,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;IACnC,OAAO,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,KAAK,CAAA;IACtC,MAAM,CAAC,EAAE,iBAAiB,GAAG,KAAK,CAAA;IAClC;gFAC4E;IAC5E,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAA;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB,CAAA;AA8BD;;;;;;;;;;;;;GAaG;AACH,iBAAS,iBAAiB,CAAC,CAAC,EAAE,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,+BAgBxD;AA4UD;;;GAGG;AACH,eAAO,MAAM,YAAY,EAA8B,OAAO,iBAAiB,CAAA"}
|