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.
Files changed (85) hide show
  1. package/AGENTS.md +29 -12
  2. package/CHANGELOG.md +28 -0
  3. package/MIGRATING.md +207 -12
  4. package/README.md +74 -21
  5. package/agent/rules/basalt-app.md +33 -3
  6. package/agent/rules/basalt-charts.md +78 -7
  7. package/agent/rules/basalt-content.md +3 -3
  8. package/agent/rules/basalt-mantine.md +4 -4
  9. package/agent/rules/basalt-tokens.md +35 -6
  10. package/agent/skills/basalt-app/SKILL.md +25 -12
  11. package/agent/skills/basalt-charts/SKILL.md +27 -10
  12. package/agent/templates/CLAUDE-block.md.tpl +3 -2
  13. package/agent/templates/DESIGN.md.tpl +3 -1
  14. package/configs/oxlint-plugin.js +49 -8
  15. package/configs/oxlint-plugin.test.ts +88 -31
  16. package/dist/charts/hooks/useBandPlot.d.ts +138 -0
  17. package/dist/charts/hooks/useBandPlot.d.ts.map +1 -0
  18. package/dist/charts/hooks/useBandPlot.js +127 -0
  19. package/dist/charts/index.d.ts +4 -0
  20. package/dist/charts/index.d.ts.map +1 -1
  21. package/dist/charts/index.js +14 -0
  22. package/dist/charts/kinds/BandStrip.d.ts +127 -0
  23. package/dist/charts/kinds/BandStrip.d.ts.map +1 -0
  24. package/dist/charts/kinds/BandStrip.js +271 -0
  25. package/dist/charts/kinds/BandStrip.test.d.ts +2 -0
  26. package/dist/charts/kinds/BandStrip.test.d.ts.map +1 -0
  27. package/dist/charts/kinds/Bars.d.ts +5 -1
  28. package/dist/charts/kinds/Bars.d.ts.map +1 -1
  29. package/dist/charts/kinds/Bars.js +2 -0
  30. package/dist/charts/kinds/MirroredBars.d.ts +95 -0
  31. package/dist/charts/kinds/MirroredBars.d.ts.map +1 -0
  32. package/dist/charts/kinds/MirroredBars.js +328 -0
  33. package/dist/charts/kinds/MirroredBars.test.d.ts +2 -0
  34. package/dist/charts/kinds/MirroredBars.test.d.ts.map +1 -0
  35. package/dist/charts/kinds/MultiLine.d.ts +5 -1
  36. package/dist/charts/kinds/MultiLine.d.ts.map +1 -1
  37. package/dist/charts/kinds/MultiLine.js +2 -0
  38. package/dist/charts/kinds/StackedArea.d.ts +5 -1
  39. package/dist/charts/kinds/StackedArea.d.ts.map +1 -1
  40. package/dist/charts/kinds/StackedArea.js +2 -0
  41. package/dist/charts/kinds/ZonedLine.d.ts +5 -1
  42. package/dist/charts/kinds/ZonedLine.d.ts.map +1 -1
  43. package/dist/charts/kinds/ZonedLine.js +2 -0
  44. package/dist/charts/primitives/CartesianChart.d.ts +18 -2
  45. package/dist/charts/primitives/CartesianChart.d.ts.map +1 -1
  46. package/dist/charts/primitives/CartesianChart.js +5 -2
  47. package/dist/charts/primitives/HatchPattern.d.ts +31 -0
  48. package/dist/charts/primitives/HatchPattern.d.ts.map +1 -0
  49. package/dist/charts/primitives/HatchPattern.js +31 -0
  50. package/dist/cli/index.d.ts +2 -0
  51. package/dist/cli/index.d.ts.map +1 -1
  52. package/dist/cli/index.js +228 -31
  53. package/dist/cli/shipped-versions.test.d.ts +2 -0
  54. package/dist/cli/shipped-versions.test.d.ts.map +1 -0
  55. package/dist/guard/index.d.ts.map +1 -1
  56. package/dist/guard/index.js +60 -13
  57. package/dist/vite.d.ts +42 -3
  58. package/dist/vite.d.ts.map +1 -1
  59. package/dist/vite.js +67 -30
  60. package/llms.txt +2 -2
  61. package/package.json +1 -1
  62. package/src/charts/hooks/useBandPlot.ts +302 -0
  63. package/src/charts/index.ts +14 -0
  64. package/src/charts/kinds/BandStrip.test.tsx +282 -0
  65. package/src/charts/kinds/BandStrip.tsx +457 -0
  66. package/src/charts/kinds/Bars.tsx +7 -1
  67. package/src/charts/kinds/DualPanel.test.tsx +10 -4
  68. package/src/charts/kinds/MirroredBars.test.tsx +232 -0
  69. package/src/charts/kinds/MirroredBars.tsx +491 -0
  70. package/src/charts/kinds/MultiLine.tsx +7 -1
  71. package/src/charts/kinds/StackedArea.tsx +7 -1
  72. package/src/charts/kinds/ZonedLine.tsx +7 -1
  73. package/src/charts/primitives/CartesianChart.test.tsx +86 -4
  74. package/src/charts/primitives/CartesianChart.tsx +28 -3
  75. package/src/charts/primitives/HatchPattern.tsx +55 -0
  76. package/src/cli/help.test.ts +74 -1
  77. package/src/cli/index.ts +436 -52
  78. package/src/cli/shipped-versions.test.ts +83 -0
  79. package/src/cli/tokens-css.test.ts +62 -0
  80. package/src/cli/toolchain-wiring.test.ts +171 -4
  81. package/src/cli/waiver-audit.test.ts +7 -3
  82. package/src/guard/check-source.test.ts +211 -42
  83. package/src/guard/index.ts +149 -23
  84. package/src/vite.test.ts +79 -0
  85. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=BandStrip.test.d.ts.map
@@ -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
- /** X tick count override. Default: as many as fit. */
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"}