@mastra/playground-ui 64.0.0-alpha.9 → 64.0.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.
Files changed (72) hide show
  1. package/dist/components/DataList.cjs.js +1 -1
  2. package/dist/components/DataList.es.js +1 -1
  3. package/dist/components/Meter.cjs.js +172 -0
  4. package/dist/components/Meter.cjs.js.map +1 -0
  5. package/dist/components/Meter.d.ts +2 -0
  6. package/dist/components/Meter.es.js +167 -0
  7. package/dist/components/Meter.es.js.map +1 -0
  8. package/dist/components/MetricsStackedBarChart.cjs.js +1 -1
  9. package/dist/components/MetricsStackedBarChart.es.js +1 -1
  10. package/dist/components/Table.cjs.js +11 -1
  11. package/dist/components/Table.cjs.js.map +1 -1
  12. package/dist/components/Table.es.js +11 -1
  13. package/dist/components/Table.es.js.map +1 -1
  14. package/dist/domains/chat/tools/badges/workflow-badge.cjs.js +0 -1
  15. package/dist/domains/chat/tools/badges/workflow-badge.cjs.js.map +1 -1
  16. package/dist/domains/chat/tools/badges/workflow-badge.es.js +0 -1
  17. package/dist/domains/chat/tools/badges/workflow-badge.es.js.map +1 -1
  18. package/dist/domains/metrics/components/agent-runs-card.cjs.js +1 -1
  19. package/dist/domains/metrics/components/agent-runs-card.es.js +1 -1
  20. package/dist/domains/metrics/components/token-usage-card.cjs.js +1 -1
  21. package/dist/domains/metrics/components/token-usage-card.es.js +1 -1
  22. package/dist/domains/traces/components/thread-view-by-trace.cjs.js +0 -1
  23. package/dist/domains/traces/components/thread-view-by-trace.cjs.js.map +1 -1
  24. package/dist/domains/traces/components/thread-view-by-trace.es.js +0 -1
  25. package/dist/domains/traces/components/thread-view-by-trace.es.js.map +1 -1
  26. package/dist/domains/traces/components/trace-columns-menu.cjs.js +9 -1
  27. package/dist/domains/traces/components/trace-columns-menu.cjs.js.map +1 -1
  28. package/dist/domains/traces/components/trace-columns-menu.es.js +9 -1
  29. package/dist/domains/traces/components/trace-columns-menu.es.js.map +1 -1
  30. package/dist/domains/traces/components/trace-data-panel.cjs.js +0 -1
  31. package/dist/domains/traces/components/trace-data-panel.cjs.js.map +1 -1
  32. package/dist/domains/traces/components/trace-data-panel.es.js +0 -1
  33. package/dist/domains/traces/components/trace-data-panel.es.js.map +1 -1
  34. package/dist/domains/traces/components/traces-list-view-adapter.cjs.js +2 -0
  35. package/dist/domains/traces/components/traces-list-view-adapter.cjs.js.map +1 -1
  36. package/dist/domains/traces/components/traces-list-view-adapter.es.js +2 -0
  37. package/dist/domains/traces/components/traces-list-view-adapter.es.js.map +1 -1
  38. package/dist/domains/traces/components/traces-list-view.cjs.js +10 -1
  39. package/dist/domains/traces/components/traces-list-view.cjs.js.map +1 -1
  40. package/dist/domains/traces/components/traces-list-view.es.js +10 -1
  41. package/dist/domains/traces/components/traces-list-view.es.js.map +1 -1
  42. package/dist/domains/traces/trace-list-columns.cjs.js +12 -4
  43. package/dist/domains/traces/trace-list-columns.cjs.js.map +1 -1
  44. package/dist/domains/traces/trace-list-columns.es.js +12 -4
  45. package/dist/domains/traces/trace-list-columns.es.js.map +1 -1
  46. package/dist/{metrics-stacked-bar-chart-BijHfnOd.cjs → metrics-stacked-bar-chart-BofJ8NDc.cjs} +45 -3
  47. package/dist/metrics-stacked-bar-chart-BofJ8NDc.cjs.map +1 -0
  48. package/dist/{metrics-stacked-bar-chart-CdcENBLD.js → metrics-stacked-bar-chart-DcxHznKw.js} +47 -5
  49. package/dist/metrics-stacked-bar-chart-DcxHznKw.js.map +1 -0
  50. package/dist/src/domains/traces/components/traces-list-view.d.ts +4 -0
  51. package/dist/src/domains/traces/trace-list-columns.d.ts +1 -1
  52. package/dist/src/ds/components/DataList/TracesDataList/traces-data-list-cells.d.ts +7 -0
  53. package/dist/src/ds/components/DataList/TracesDataList/traces-data-list.d.ts +2 -1
  54. package/dist/src/ds/components/Meter/index.d.ts +2 -0
  55. package/dist/src/ds/components/Meter/meter-context.d.ts +6 -0
  56. package/dist/src/ds/components/Meter/meter-key-row.d.ts +6 -0
  57. package/dist/src/ds/components/Meter/meter-root.d.ts +14 -0
  58. package/dist/src/ds/components/Meter/meter-segment.d.ts +5 -0
  59. package/dist/src/ds/components/Meter/meter-source.d.ts +6 -0
  60. package/dist/src/ds/components/Meter/meter.d.ts +6 -0
  61. package/dist/src/ds/components/MetricsStackedBarChart/metrics-stacked-bar-chart.d.ts +1 -0
  62. package/dist/src/ds/components/Table/Table.d.ts +4 -2
  63. package/dist/style.css +117 -1
  64. package/dist/{traces-data-list-CHREkLv0.cjs → traces-data-list-BH24OVKh.cjs} +7 -1
  65. package/dist/traces-data-list-BH24OVKh.cjs.map +1 -0
  66. package/dist/{traces-data-list-BgloVIVi.js → traces-data-list-BOJB37dV.js} +7 -1
  67. package/dist/traces-data-list-BOJB37dV.js.map +1 -0
  68. package/package.json +11 -11
  69. package/dist/metrics-stacked-bar-chart-BijHfnOd.cjs.map +0 -1
  70. package/dist/metrics-stacked-bar-chart-CdcENBLD.js.map +0 -1
  71. package/dist/traces-data-list-BgloVIVi.js.map +0 -1
  72. package/dist/traces-data-list-CHREkLv0.cjs.map +0 -1
@@ -19,6 +19,7 @@ const GRADIENT_BASE = 0.75;
19
19
  const CAP_BODY = 0.55;
20
20
  const CAP_HEIGHT = 3;
21
21
  const DIMMED = 0.3;
22
+ const COLUMN_LABEL_SPACE = 16;
22
23
  function segmentShape({
23
24
  fill,
24
25
  color,
@@ -77,6 +78,7 @@ function BarPlot({
77
78
  timestampKey = "tsMs",
78
79
  xLabels = "auto",
79
80
  tooltipLabelKey,
81
+ columnLabelKey,
80
82
  onBucketClick,
81
83
  overlay,
82
84
  id
@@ -101,13 +103,14 @@ function BarPlot({
101
103
  }, [keyList, colorList, variant, id]);
102
104
  const format = valueFormatter ?? primitives_chartFrame.compactNumber.format;
103
105
  const plotWidth = size.width - (showYAxis ? primitives_chartFrame.Y_AXIS_WIDTH : 0);
106
+ const margin = columnLabelKey ? { ...primitives_chartLayout.CHART_MARGIN, top: primitives_chartLayout.CHART_MARGIN.top + COLUMN_LABEL_SPACE } : primitives_chartLayout.CHART_MARGIN;
104
107
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
105
108
  /* @__PURE__ */ jsxRuntime.jsx(HoverDim, { scope: id, setter: setHovered }),
106
109
  /* @__PURE__ */ jsxRuntime.jsx(primitives_chartPlot.ChartPlot, { height, plotRef: ref, onResize, clickable: !!onBucketClick, children: /* @__PURE__ */ jsxRuntime.jsxs(
107
110
  recharts.ComposedChart,
108
111
  {
109
112
  data,
110
- margin: primitives_chartLayout.CHART_MARGIN,
113
+ margin,
111
114
  onMouseMove: (state) => {
112
115
  const index = state?.activeTooltipIndex;
113
116
  setHovered.current(index === void 0 || index === null ? void 0 : Number(index));
@@ -157,7 +160,23 @@ function BarPlot({
157
160
  fill: s.color,
158
161
  maxBarSize: 28,
159
162
  isAnimationActive: false,
160
- shape: shapes[i]
163
+ shape: shapes[i],
164
+ children: columnLabelKey && /* @__PURE__ */ jsxRuntime.jsx(
165
+ recharts.LabelList,
166
+ {
167
+ dataKey: columnLabelKey,
168
+ content: (props) => /* @__PURE__ */ jsxRuntime.jsx(
169
+ ColumnLabel,
170
+ {
171
+ ...props,
172
+ row: data[Number(props.index)],
173
+ keys: series.map(({ dataKey }) => dataKey),
174
+ self: i,
175
+ color: s.color
176
+ }
177
+ )
178
+ }
179
+ )
161
180
  },
162
181
  s.dataKey
163
182
  )),
@@ -192,6 +211,29 @@ function BarPlot({
192
211
  ) })
193
212
  ] });
194
213
  }
214
+ function paintedTop(values, self, box) {
215
+ if (values.length > 1) return primitives_chartColumnLayout.stackedSegmentBox(values, self, box, { gap: SEGMENT_GAP })?.y;
216
+ return primitives_chartColumnLayout.singleBarBox(values[self] ?? 0, box)?.y;
217
+ }
218
+ function ColumnLabel({ x, y, width, height, value, row, keys, self, color }) {
219
+ if (value === void 0 || value === null || value === "") return null;
220
+ const values = keys.map((key) => Number(row?.[key]) || 0);
221
+ const topmost = values.findLastIndex((v) => v > 0);
222
+ if (self !== (topmost === -1 ? keys.length - 1 : topmost)) return null;
223
+ const top = paintedTop(values, self, { y: Number(y), height: Math.max(Number(height), 0) }) ?? Number(y);
224
+ return /* @__PURE__ */ jsxRuntime.jsx(
225
+ "text",
226
+ {
227
+ x: Number(x) + Number(width) / 2,
228
+ y: top - 6,
229
+ textAnchor: "middle",
230
+ fontSize: primitives_chartLayout.CHART_AXIS_FONT_SIZE,
231
+ fill: color,
232
+ className: "tabular-nums",
233
+ children: String(value)
234
+ }
235
+ );
236
+ }
195
237
 
196
238
  exports.MetricsStackedBarChart = MetricsStackedBarChart;
197
- //# sourceMappingURL=metrics-stacked-bar-chart-BijHfnOd.cjs.map
239
+ //# sourceMappingURL=metrics-stacked-bar-chart-BofJ8NDc.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics-stacked-bar-chart-BofJ8NDc.cjs","sources":["../src/ds/components/MetricsStackedBarChart/metrics-stacked-bar-chart.tsx"],"sourcesContent":["import { useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { Bar, CartesianGrid, ComposedChart, LabelList, Line, Rectangle, ReferenceLine, Tooltip } from 'recharts';\nimport type { LabelProps } from 'recharts';\nimport { ChartSkeleton } from '@/ds/components/ChartSkeleton';\nimport type { MetricsLineChartSeries } from '@/ds/components/MetricsLineChart';\nimport { MetricsLineChartLegend, MetricsLineChartTooltip } from '@/ds/components/MetricsLineChart';\nimport { CHART_GRID_PROPS, useChartSize } from '@/ds/primitives/chart-axes';\nimport type { ChartXLabels } from '@/ds/primitives/chart-axes';\nimport { singleBarBox, stackedSegmentBox } from '@/ds/primitives/chart-column-layout';\nimport type { SegmentBox } from '@/ds/primitives/chart-column-layout';\nimport { CHART_TICK, Y_AXIS_WIDTH, compactNumber, timeXAxis, valueYAxis } from '@/ds/primitives/chart-frame';\nimport type { ChartHeight } from '@/ds/primitives/chart-frame';\nimport { CHART_AXIS_FONT_SIZE, CHART_MARGIN } from '@/ds/primitives/chart-layout';\nimport { ChartPlot } from '@/ds/primitives/chart-plot';\nimport { useChartDefsId } from '@/ds/primitives/use-chart-defs-id';\nimport { cn } from '@/lib/utils';\n\n/** Corner radius of every segment; thin segments scale it down so they stay crisp rectangles. */\nconst RADIUS = 2;\n/** Pixels between stacked segments, so neighbouring segments read as separate blocks. */\nconst SEGMENT_GAP = 2;\n/** Opacity at the base of a segment's gradient (the top is fully opaque). */\nconst GRADIENT_BASE = 0.75;\n/** Single-series bars: translucent body under a solid cap that marks the value. */\nconst CAP_BODY = 0.55;\nconst CAP_HEIGHT = 3;\n/** Opacity of the other columns while one is hovered. */\nconst DIMMED = 0.3;\nconst COLUMN_LABEL_SPACE = 16;\n\ntype SegmentProps = {\n x?: number;\n y?: number;\n width?: number;\n height?: number;\n index?: number;\n payload?: Record<string, unknown>;\n};\n\nfunction segmentShape({\n fill,\n color,\n capped,\n keys,\n dataKey,\n}: {\n fill: string;\n color: string;\n capped: boolean;\n /** The column's data keys, bottom to top. */\n keys: string[];\n dataKey: string;\n}) {\n return function Segment({ x = 0, width = 0, index, payload, ...geo }: SegmentProps) {\n const values = keys.map(k => Number(payload?.[k]) || 0);\n const self = keys.indexOf(dataKey);\n const box = { y: geo.y ?? 0, height: Math.max(geo.height ?? 0, 0) };\n // Every non-zero value gets a few readable pixels; zeros draw nothing.\n const laid =\n keys.length > 1\n ? stackedSegmentBox(values, self, box, { gap: SEGMENT_GAP })\n : singleBarBox(values[self] ?? 0, box);\n if (!laid) return <g />;\n const { y, height: h } = laid;\n const radius = Math.min(RADIUS, Math.floor(h / 3));\n // Dimming is a CSS rule keyed on `data-bucket` (see `HoverDim`), so hovering re-renders no bars.\n const bucket = { 'data-bucket': index, style: { transition: 'opacity 150ms ease-out' } };\n\n if (capped) {\n return (\n <g {...bucket}>\n <Rectangle x={x} y={y} width={width} height={h} radius={radius} fill={color} fillOpacity={CAP_BODY} />\n <Rectangle x={x} y={y} width={width} height={Math.min(CAP_HEIGHT, h)} radius={radius} fill={color} />\n </g>\n );\n }\n return (\n <g {...bucket}>\n <Rectangle x={x} y={y} width={width} height={h} radius={radius} fill={fill} />\n </g>\n );\n };\n}\n\n/**\n * Dims every column but the hovered one. Its own tiny state, so a hover only re-renders this\n * <style> tag: with hundreds of buckets, re-rendering the bars on each move froze the pointer.\n */\nfunction HoverDim({ scope, setter }: { scope: string; setter: { current: (index: number | undefined) => void } }) {\n const [hovered, setHovered] = useState<number>();\n useLayoutEffect(() => {\n setter.current = setHovered;\n }, [setter]);\n if (hovered === undefined) return null;\n return (\n <style>{`[data-chart-scope=\"${scope}\"] [data-bucket]:not([data-bucket=\"${hovered}\"]){opacity:${DIMMED}}`}</style>\n );\n}\n\n/** A line drawn over the bars on its own scale, e.g. average wake time over cold starts. */\nexport type MetricsStackedBarChartOverlay = MetricsLineChartSeries & {\n valueFormatter?: (value: number) => string;\n};\n\nexport type MetricsStackedBarChartProps = {\n data: Record<string, unknown>[];\n series: MetricsLineChartSeries[];\n /** Pixels, or `fill` to grow with the parent (a flex column, e.g. a card's content). */\n height?: ChartHeight;\n yDomain?: [number, number];\n /** Formats tooltip values, and y-axis ticks unless `axisFormatter` is set. */\n valueFormatter?: (value: number) => string;\n /** Formats y-axis ticks, when they need a shorter form than the tooltip. */\n axisFormatter?: (value: number) => string;\n showLegend?: boolean;\n referenceLine?: { value: number; label: string; color: string };\n /**\n * `gradient`: segments fade gently toward the base. Reads best for stacks.\n * `capped`: a translucent body under a solid cap that marks the value. Reads best for one\n * value per column.\n */\n variant?: 'gradient' | 'capped';\n /**\n * Set to `false` to drop the y-axis labels and let the plot span the card. The gridlines stay\n * for relative scale; exact values come from the tooltip and the card's summary.\n */\n showYAxis?: boolean;\n /** Adds a \"Total\" row (the column's height) to the tooltip. Defaults to on for stacks. */\n showTotal?: boolean;\n /** Row field printed under the x-axis. */\n xKey?: string;\n /** Row field with the bucket's start time (ms), which places labels on round clock times. */\n timestampKey?: string;\n /** `auto` fits as many labels as the width allows; `edges` prints only the first and last. */\n xLabels?: ChartXLabels;\n /** Row field for the tooltip heading (e.g. a longer date); defaults to the x-axis label. */\n tooltipLabelKey?: string;\n columnLabelKey?: string;\n /** Click a column (e.g. to open its traces); the plot shows a pointer cursor. */\n onBucketClick?: (row: Record<string, unknown>, index: number) => void;\n /** One dashed line over the bars, on its own hidden scale (e.g. a duration over counts). */\n overlay?: MetricsStackedBarChartOverlay;\n /** Show a ghost of the chart while data loads, in the chart's own footprint. */\n isLoading?: boolean;\n className?: string;\n};\n\nexport function MetricsStackedBarChart(props: MetricsStackedBarChartProps) {\n const { data, series, overlay, height = 210, showLegend = true, isLoading = false, className } = props;\n const id = useChartDefsId();\n const root = cn(height === 'fill' && 'flex min-h-0 flex-1 flex-col', className);\n const legend = overlay ? [...series, { ...overlay, dashed: true }] : series;\n // The legend stays while loading: it comes from the series, not the data.\n return (\n <div className={root} data-chart-scope={id}>\n {showLegend && <MetricsLineChartLegend data={isLoading ? undefined : data} series={legend} className=\"mb-4\" />}\n {isLoading ? <ChartSkeleton kind=\"bar\" height={height} /> : <BarPlot {...props} id={id} />}\n </div>\n );\n}\n\n/** The plot itself, once the data is in; `id` scopes its gradients and hover rule. */\nfunction BarPlot({\n data,\n series,\n height = 210,\n yDomain,\n valueFormatter,\n axisFormatter,\n referenceLine,\n variant = 'gradient',\n showYAxis = true,\n showTotal = series.length > 1,\n xKey = 'time',\n timestampKey = 'tsMs',\n xLabels = 'auto',\n tooltipLabelKey,\n columnLabelKey,\n onBucketClick,\n overlay,\n id,\n}: MetricsStackedBarChartProps & { id: string }) {\n const setHovered = useRef<(index: number | undefined) => void>(() => {});\n const { size, onResize, ref } = useChartSize();\n\n const keyList = series.map(s => s.dataKey).join('\\u0000');\n const colorList = series.map(s => s.color).join('\\u0000');\n // Stable shapes, so Recharts doesn't re-render every bar when the parent re-renders.\n const shapes = useMemo(() => {\n const keys = keyList.split('\\u0000');\n const colors = colorList.split('\\u0000');\n return keys.map((dataKey, i) =>\n segmentShape({\n fill: `url(#${id}-bar-${i})`,\n color: colors[i] ?? '',\n capped: variant === 'capped',\n keys,\n dataKey,\n }),\n );\n }, [keyList, colorList, variant, id]);\n\n const format = valueFormatter ?? compactNumber.format;\n const plotWidth = size.width - (showYAxis ? Y_AXIS_WIDTH : 0);\n const margin = columnLabelKey ? { ...CHART_MARGIN, top: CHART_MARGIN.top + COLUMN_LABEL_SPACE } : CHART_MARGIN;\n\n return (\n <>\n <HoverDim scope={id} setter={setHovered} />\n <ChartPlot height={height} plotRef={ref} onResize={onResize} clickable={!!onBucketClick}>\n <ComposedChart\n data={data}\n margin={margin}\n onMouseMove={state => {\n const index = state?.activeTooltipIndex;\n setHovered.current(index === undefined || index === null ? undefined : Number(index));\n }}\n onMouseLeave={() => setHovered.current(undefined)}\n onClick={state => {\n const i = state?.activeTooltipIndex;\n const row = i === undefined || i === null ? undefined : data[Number(i)];\n if (onBucketClick && row) onBucketClick(row, Number(i));\n }}\n >\n <defs>\n {series.map((s, i) => (\n <linearGradient key={s.dataKey} id={`${id}-bar-${i}`} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor={s.color} stopOpacity={1} />\n <stop offset=\"100%\" stopColor={s.color} stopOpacity={GRADIENT_BASE} />\n </linearGradient>\n ))}\n </defs>\n <CartesianGrid {...CHART_GRID_PROPS} />\n {timeXAxis({ data, xKey, timestampKey, xLabels, plotWidth })}\n {valueYAxis({ show: showYAxis, size, formatter: axisFormatter ?? format, domain: yDomain })}\n {overlay &&\n valueYAxis({\n id: 'overlay',\n show: false,\n size,\n formatter: overlay.valueFormatter ?? compactNumber.format,\n right: true,\n })}\n <Tooltip\n cursor={false}\n content={\n <MetricsLineChartTooltip\n formatValue={format}\n showTotal={showTotal && !overlay}\n labelKey={tooltipLabelKey}\n formatByKey={overlay?.valueFormatter ? { [overlay.dataKey]: overlay.valueFormatter } : undefined}\n />\n }\n />\n {series.map((s, i) => (\n <Bar\n key={s.dataKey}\n dataKey={s.dataKey}\n name={s.label}\n stackId=\"1\"\n fill={s.color}\n maxBarSize={28}\n isAnimationActive={false}\n shape={shapes[i]}\n >\n {columnLabelKey && (\n <LabelList\n dataKey={columnLabelKey}\n content={(props: LabelProps) => (\n <ColumnLabel\n {...props}\n row={data[Number(props.index)]}\n keys={series.map(({ dataKey }) => dataKey)}\n self={i}\n color={s.color}\n />\n )}\n />\n )}\n </Bar>\n ))}\n {overlay && (\n <Line\n yAxisId=\"overlay\"\n type=\"monotone\"\n dataKey={overlay.dataKey}\n name={overlay.label}\n stroke={overlay.color}\n strokeWidth={1.75}\n strokeDasharray=\"4 3\"\n dot={false}\n activeDot={{ r: 3.5, fill: overlay.color, stroke: 'var(--background)', strokeWidth: 2 }}\n isAnimationActive={false}\n connectNulls\n />\n )}\n {referenceLine && (\n <ReferenceLine\n y={referenceLine.value}\n ifOverflow=\"extendDomain\"\n stroke={referenceLine.color}\n strokeDasharray=\"4 4\"\n label={{ value: referenceLine.label, position: 'insideTopLeft', ...CHART_TICK }}\n />\n )}\n </ComposedChart>\n </ChartPlot>\n </>\n );\n}\n\ntype ColumnLabelProps = LabelProps & {\n row: MetricsStackedBarChartProps['data'][number] | undefined;\n keys: string[];\n self: number;\n color: string;\n};\n\nfunction paintedTop(values: number[], self: number, box: SegmentBox) {\n if (values.length > 1) return stackedSegmentBox(values, self, box, { gap: SEGMENT_GAP })?.y;\n return singleBarBox(values[self] ?? 0, box)?.y;\n}\n\nfunction ColumnLabel({ x, y, width, height, value, row, keys, self, color }: ColumnLabelProps) {\n if (value === undefined || value === null || value === '') return null;\n const values = keys.map(key => Number(row?.[key]) || 0);\n const topmost = values.findLastIndex(v => v > 0);\n if (self !== (topmost === -1 ? keys.length - 1 : topmost)) return null;\n const top = paintedTop(values, self, { y: Number(y), height: Math.max(Number(height), 0) }) ?? Number(y);\n return (\n <text\n x={Number(x) + Number(width) / 2}\n y={top - 6}\n textAnchor=\"middle\"\n fontSize={CHART_AXIS_FONT_SIZE}\n fill={color}\n className=\"tabular-nums\"\n >\n {String(value)}\n </text>\n );\n}\n"],"names":["stackedSegmentBox","singleBarBox","jsx","jsxs","Rectangle","useState","useLayoutEffect","useChartDefsId","cn","MetricsLineChartLegend","ChartSkeleton","useRef","useChartSize","useMemo","compactNumber","Y_AXIS_WIDTH","CHART_MARGIN","Fragment","ChartPlot","ComposedChart","CartesianGrid","CHART_GRID_PROPS","timeXAxis","valueYAxis","Tooltip","MetricsLineChartTooltip","Bar","LabelList","Line","ReferenceLine","CHART_TICK","CHART_AXIS_FONT_SIZE"],"mappings":"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"}
@@ -1,12 +1,12 @@
1
1
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
2
  import { useRef, useMemo, useState, useLayoutEffect } from 'react';
3
- import { ComposedChart, CartesianGrid, Tooltip, Bar, Line, ReferenceLine, Rectangle } from 'recharts';
3
+ import { ComposedChart, CartesianGrid, Tooltip, Bar, LabelList, Line, ReferenceLine, Rectangle } from 'recharts';
4
4
  import { C as ChartSkeleton } from './chart-skeleton-C2y9C4yt.js';
5
5
  import { M as MetricsLineChartLegend, a as MetricsLineChartTooltip } from './metrics-line-chart-tooltip-CGFjb9nn.js';
6
6
  import { useChartSize, CHART_GRID_PROPS } from './primitives/chart-axes.es.js';
7
7
  import { stackedSegmentBox, singleBarBox } from './primitives/chart-column-layout.es.js';
8
8
  import { compactNumber, Y_AXIS_WIDTH, timeXAxis, valueYAxis, CHART_TICK } from './primitives/chart-frame.es.js';
9
- import { CHART_MARGIN } from './primitives/chart-layout.es.js';
9
+ import { CHART_MARGIN, CHART_AXIS_FONT_SIZE } from './primitives/chart-layout.es.js';
10
10
  import { ChartPlot } from './primitives/chart-plot.es.js';
11
11
  import { useChartDefsId } from './primitives/use-chart-defs-id.es.js';
12
12
  import { c as cn } from './cn-CQUhN5Jx.js';
@@ -17,6 +17,7 @@ const GRADIENT_BASE = 0.75;
17
17
  const CAP_BODY = 0.55;
18
18
  const CAP_HEIGHT = 3;
19
19
  const DIMMED = 0.3;
20
+ const COLUMN_LABEL_SPACE = 16;
20
21
  function segmentShape({
21
22
  fill,
22
23
  color,
@@ -75,6 +76,7 @@ function BarPlot({
75
76
  timestampKey = "tsMs",
76
77
  xLabels = "auto",
77
78
  tooltipLabelKey,
79
+ columnLabelKey,
78
80
  onBucketClick,
79
81
  overlay,
80
82
  id
@@ -99,13 +101,14 @@ function BarPlot({
99
101
  }, [keyList, colorList, variant, id]);
100
102
  const format = valueFormatter ?? compactNumber.format;
101
103
  const plotWidth = size.width - (showYAxis ? Y_AXIS_WIDTH : 0);
104
+ const margin = columnLabelKey ? { ...CHART_MARGIN, top: CHART_MARGIN.top + COLUMN_LABEL_SPACE } : CHART_MARGIN;
102
105
  return /* @__PURE__ */ jsxs(Fragment, { children: [
103
106
  /* @__PURE__ */ jsx(HoverDim, { scope: id, setter: setHovered }),
104
107
  /* @__PURE__ */ jsx(ChartPlot, { height, plotRef: ref, onResize, clickable: !!onBucketClick, children: /* @__PURE__ */ jsxs(
105
108
  ComposedChart,
106
109
  {
107
110
  data,
108
- margin: CHART_MARGIN,
111
+ margin,
109
112
  onMouseMove: (state) => {
110
113
  const index = state?.activeTooltipIndex;
111
114
  setHovered.current(index === void 0 || index === null ? void 0 : Number(index));
@@ -155,7 +158,23 @@ function BarPlot({
155
158
  fill: s.color,
156
159
  maxBarSize: 28,
157
160
  isAnimationActive: false,
158
- shape: shapes[i]
161
+ shape: shapes[i],
162
+ children: columnLabelKey && /* @__PURE__ */ jsx(
163
+ LabelList,
164
+ {
165
+ dataKey: columnLabelKey,
166
+ content: (props) => /* @__PURE__ */ jsx(
167
+ ColumnLabel,
168
+ {
169
+ ...props,
170
+ row: data[Number(props.index)],
171
+ keys: series.map(({ dataKey }) => dataKey),
172
+ self: i,
173
+ color: s.color
174
+ }
175
+ )
176
+ }
177
+ )
159
178
  },
160
179
  s.dataKey
161
180
  )),
@@ -190,6 +209,29 @@ function BarPlot({
190
209
  ) })
191
210
  ] });
192
211
  }
212
+ function paintedTop(values, self, box) {
213
+ if (values.length > 1) return stackedSegmentBox(values, self, box, { gap: SEGMENT_GAP })?.y;
214
+ return singleBarBox(values[self] ?? 0, box)?.y;
215
+ }
216
+ function ColumnLabel({ x, y, width, height, value, row, keys, self, color }) {
217
+ if (value === void 0 || value === null || value === "") return null;
218
+ const values = keys.map((key) => Number(row?.[key]) || 0);
219
+ const topmost = values.findLastIndex((v) => v > 0);
220
+ if (self !== (topmost === -1 ? keys.length - 1 : topmost)) return null;
221
+ const top = paintedTop(values, self, { y: Number(y), height: Math.max(Number(height), 0) }) ?? Number(y);
222
+ return /* @__PURE__ */ jsx(
223
+ "text",
224
+ {
225
+ x: Number(x) + Number(width) / 2,
226
+ y: top - 6,
227
+ textAnchor: "middle",
228
+ fontSize: CHART_AXIS_FONT_SIZE,
229
+ fill: color,
230
+ className: "tabular-nums",
231
+ children: String(value)
232
+ }
233
+ );
234
+ }
193
235
 
194
236
  export { MetricsStackedBarChart as M };
195
- //# sourceMappingURL=metrics-stacked-bar-chart-CdcENBLD.js.map
237
+ //# sourceMappingURL=metrics-stacked-bar-chart-DcxHznKw.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics-stacked-bar-chart-DcxHznKw.js","sources":["../src/ds/components/MetricsStackedBarChart/metrics-stacked-bar-chart.tsx"],"sourcesContent":["import { useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { Bar, CartesianGrid, ComposedChart, LabelList, Line, Rectangle, ReferenceLine, Tooltip } from 'recharts';\nimport type { LabelProps } from 'recharts';\nimport { ChartSkeleton } from '@/ds/components/ChartSkeleton';\nimport type { MetricsLineChartSeries } from '@/ds/components/MetricsLineChart';\nimport { MetricsLineChartLegend, MetricsLineChartTooltip } from '@/ds/components/MetricsLineChart';\nimport { CHART_GRID_PROPS, useChartSize } from '@/ds/primitives/chart-axes';\nimport type { ChartXLabels } from '@/ds/primitives/chart-axes';\nimport { singleBarBox, stackedSegmentBox } from '@/ds/primitives/chart-column-layout';\nimport type { SegmentBox } from '@/ds/primitives/chart-column-layout';\nimport { CHART_TICK, Y_AXIS_WIDTH, compactNumber, timeXAxis, valueYAxis } from '@/ds/primitives/chart-frame';\nimport type { ChartHeight } from '@/ds/primitives/chart-frame';\nimport { CHART_AXIS_FONT_SIZE, CHART_MARGIN } from '@/ds/primitives/chart-layout';\nimport { ChartPlot } from '@/ds/primitives/chart-plot';\nimport { useChartDefsId } from '@/ds/primitives/use-chart-defs-id';\nimport { cn } from '@/lib/utils';\n\n/** Corner radius of every segment; thin segments scale it down so they stay crisp rectangles. */\nconst RADIUS = 2;\n/** Pixels between stacked segments, so neighbouring segments read as separate blocks. */\nconst SEGMENT_GAP = 2;\n/** Opacity at the base of a segment's gradient (the top is fully opaque). */\nconst GRADIENT_BASE = 0.75;\n/** Single-series bars: translucent body under a solid cap that marks the value. */\nconst CAP_BODY = 0.55;\nconst CAP_HEIGHT = 3;\n/** Opacity of the other columns while one is hovered. */\nconst DIMMED = 0.3;\nconst COLUMN_LABEL_SPACE = 16;\n\ntype SegmentProps = {\n x?: number;\n y?: number;\n width?: number;\n height?: number;\n index?: number;\n payload?: Record<string, unknown>;\n};\n\nfunction segmentShape({\n fill,\n color,\n capped,\n keys,\n dataKey,\n}: {\n fill: string;\n color: string;\n capped: boolean;\n /** The column's data keys, bottom to top. */\n keys: string[];\n dataKey: string;\n}) {\n return function Segment({ x = 0, width = 0, index, payload, ...geo }: SegmentProps) {\n const values = keys.map(k => Number(payload?.[k]) || 0);\n const self = keys.indexOf(dataKey);\n const box = { y: geo.y ?? 0, height: Math.max(geo.height ?? 0, 0) };\n // Every non-zero value gets a few readable pixels; zeros draw nothing.\n const laid =\n keys.length > 1\n ? stackedSegmentBox(values, self, box, { gap: SEGMENT_GAP })\n : singleBarBox(values[self] ?? 0, box);\n if (!laid) return <g />;\n const { y, height: h } = laid;\n const radius = Math.min(RADIUS, Math.floor(h / 3));\n // Dimming is a CSS rule keyed on `data-bucket` (see `HoverDim`), so hovering re-renders no bars.\n const bucket = { 'data-bucket': index, style: { transition: 'opacity 150ms ease-out' } };\n\n if (capped) {\n return (\n <g {...bucket}>\n <Rectangle x={x} y={y} width={width} height={h} radius={radius} fill={color} fillOpacity={CAP_BODY} />\n <Rectangle x={x} y={y} width={width} height={Math.min(CAP_HEIGHT, h)} radius={radius} fill={color} />\n </g>\n );\n }\n return (\n <g {...bucket}>\n <Rectangle x={x} y={y} width={width} height={h} radius={radius} fill={fill} />\n </g>\n );\n };\n}\n\n/**\n * Dims every column but the hovered one. Its own tiny state, so a hover only re-renders this\n * <style> tag: with hundreds of buckets, re-rendering the bars on each move froze the pointer.\n */\nfunction HoverDim({ scope, setter }: { scope: string; setter: { current: (index: number | undefined) => void } }) {\n const [hovered, setHovered] = useState<number>();\n useLayoutEffect(() => {\n setter.current = setHovered;\n }, [setter]);\n if (hovered === undefined) return null;\n return (\n <style>{`[data-chart-scope=\"${scope}\"] [data-bucket]:not([data-bucket=\"${hovered}\"]){opacity:${DIMMED}}`}</style>\n );\n}\n\n/** A line drawn over the bars on its own scale, e.g. average wake time over cold starts. */\nexport type MetricsStackedBarChartOverlay = MetricsLineChartSeries & {\n valueFormatter?: (value: number) => string;\n};\n\nexport type MetricsStackedBarChartProps = {\n data: Record<string, unknown>[];\n series: MetricsLineChartSeries[];\n /** Pixels, or `fill` to grow with the parent (a flex column, e.g. a card's content). */\n height?: ChartHeight;\n yDomain?: [number, number];\n /** Formats tooltip values, and y-axis ticks unless `axisFormatter` is set. */\n valueFormatter?: (value: number) => string;\n /** Formats y-axis ticks, when they need a shorter form than the tooltip. */\n axisFormatter?: (value: number) => string;\n showLegend?: boolean;\n referenceLine?: { value: number; label: string; color: string };\n /**\n * `gradient`: segments fade gently toward the base. Reads best for stacks.\n * `capped`: a translucent body under a solid cap that marks the value. Reads best for one\n * value per column.\n */\n variant?: 'gradient' | 'capped';\n /**\n * Set to `false` to drop the y-axis labels and let the plot span the card. The gridlines stay\n * for relative scale; exact values come from the tooltip and the card's summary.\n */\n showYAxis?: boolean;\n /** Adds a \"Total\" row (the column's height) to the tooltip. Defaults to on for stacks. */\n showTotal?: boolean;\n /** Row field printed under the x-axis. */\n xKey?: string;\n /** Row field with the bucket's start time (ms), which places labels on round clock times. */\n timestampKey?: string;\n /** `auto` fits as many labels as the width allows; `edges` prints only the first and last. */\n xLabels?: ChartXLabels;\n /** Row field for the tooltip heading (e.g. a longer date); defaults to the x-axis label. */\n tooltipLabelKey?: string;\n columnLabelKey?: string;\n /** Click a column (e.g. to open its traces); the plot shows a pointer cursor. */\n onBucketClick?: (row: Record<string, unknown>, index: number) => void;\n /** One dashed line over the bars, on its own hidden scale (e.g. a duration over counts). */\n overlay?: MetricsStackedBarChartOverlay;\n /** Show a ghost of the chart while data loads, in the chart's own footprint. */\n isLoading?: boolean;\n className?: string;\n};\n\nexport function MetricsStackedBarChart(props: MetricsStackedBarChartProps) {\n const { data, series, overlay, height = 210, showLegend = true, isLoading = false, className } = props;\n const id = useChartDefsId();\n const root = cn(height === 'fill' && 'flex min-h-0 flex-1 flex-col', className);\n const legend = overlay ? [...series, { ...overlay, dashed: true }] : series;\n // The legend stays while loading: it comes from the series, not the data.\n return (\n <div className={root} data-chart-scope={id}>\n {showLegend && <MetricsLineChartLegend data={isLoading ? undefined : data} series={legend} className=\"mb-4\" />}\n {isLoading ? <ChartSkeleton kind=\"bar\" height={height} /> : <BarPlot {...props} id={id} />}\n </div>\n );\n}\n\n/** The plot itself, once the data is in; `id` scopes its gradients and hover rule. */\nfunction BarPlot({\n data,\n series,\n height = 210,\n yDomain,\n valueFormatter,\n axisFormatter,\n referenceLine,\n variant = 'gradient',\n showYAxis = true,\n showTotal = series.length > 1,\n xKey = 'time',\n timestampKey = 'tsMs',\n xLabels = 'auto',\n tooltipLabelKey,\n columnLabelKey,\n onBucketClick,\n overlay,\n id,\n}: MetricsStackedBarChartProps & { id: string }) {\n const setHovered = useRef<(index: number | undefined) => void>(() => {});\n const { size, onResize, ref } = useChartSize();\n\n const keyList = series.map(s => s.dataKey).join('\\u0000');\n const colorList = series.map(s => s.color).join('\\u0000');\n // Stable shapes, so Recharts doesn't re-render every bar when the parent re-renders.\n const shapes = useMemo(() => {\n const keys = keyList.split('\\u0000');\n const colors = colorList.split('\\u0000');\n return keys.map((dataKey, i) =>\n segmentShape({\n fill: `url(#${id}-bar-${i})`,\n color: colors[i] ?? '',\n capped: variant === 'capped',\n keys,\n dataKey,\n }),\n );\n }, [keyList, colorList, variant, id]);\n\n const format = valueFormatter ?? compactNumber.format;\n const plotWidth = size.width - (showYAxis ? Y_AXIS_WIDTH : 0);\n const margin = columnLabelKey ? { ...CHART_MARGIN, top: CHART_MARGIN.top + COLUMN_LABEL_SPACE } : CHART_MARGIN;\n\n return (\n <>\n <HoverDim scope={id} setter={setHovered} />\n <ChartPlot height={height} plotRef={ref} onResize={onResize} clickable={!!onBucketClick}>\n <ComposedChart\n data={data}\n margin={margin}\n onMouseMove={state => {\n const index = state?.activeTooltipIndex;\n setHovered.current(index === undefined || index === null ? undefined : Number(index));\n }}\n onMouseLeave={() => setHovered.current(undefined)}\n onClick={state => {\n const i = state?.activeTooltipIndex;\n const row = i === undefined || i === null ? undefined : data[Number(i)];\n if (onBucketClick && row) onBucketClick(row, Number(i));\n }}\n >\n <defs>\n {series.map((s, i) => (\n <linearGradient key={s.dataKey} id={`${id}-bar-${i}`} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor={s.color} stopOpacity={1} />\n <stop offset=\"100%\" stopColor={s.color} stopOpacity={GRADIENT_BASE} />\n </linearGradient>\n ))}\n </defs>\n <CartesianGrid {...CHART_GRID_PROPS} />\n {timeXAxis({ data, xKey, timestampKey, xLabels, plotWidth })}\n {valueYAxis({ show: showYAxis, size, formatter: axisFormatter ?? format, domain: yDomain })}\n {overlay &&\n valueYAxis({\n id: 'overlay',\n show: false,\n size,\n formatter: overlay.valueFormatter ?? compactNumber.format,\n right: true,\n })}\n <Tooltip\n cursor={false}\n content={\n <MetricsLineChartTooltip\n formatValue={format}\n showTotal={showTotal && !overlay}\n labelKey={tooltipLabelKey}\n formatByKey={overlay?.valueFormatter ? { [overlay.dataKey]: overlay.valueFormatter } : undefined}\n />\n }\n />\n {series.map((s, i) => (\n <Bar\n key={s.dataKey}\n dataKey={s.dataKey}\n name={s.label}\n stackId=\"1\"\n fill={s.color}\n maxBarSize={28}\n isAnimationActive={false}\n shape={shapes[i]}\n >\n {columnLabelKey && (\n <LabelList\n dataKey={columnLabelKey}\n content={(props: LabelProps) => (\n <ColumnLabel\n {...props}\n row={data[Number(props.index)]}\n keys={series.map(({ dataKey }) => dataKey)}\n self={i}\n color={s.color}\n />\n )}\n />\n )}\n </Bar>\n ))}\n {overlay && (\n <Line\n yAxisId=\"overlay\"\n type=\"monotone\"\n dataKey={overlay.dataKey}\n name={overlay.label}\n stroke={overlay.color}\n strokeWidth={1.75}\n strokeDasharray=\"4 3\"\n dot={false}\n activeDot={{ r: 3.5, fill: overlay.color, stroke: 'var(--background)', strokeWidth: 2 }}\n isAnimationActive={false}\n connectNulls\n />\n )}\n {referenceLine && (\n <ReferenceLine\n y={referenceLine.value}\n ifOverflow=\"extendDomain\"\n stroke={referenceLine.color}\n strokeDasharray=\"4 4\"\n label={{ value: referenceLine.label, position: 'insideTopLeft', ...CHART_TICK }}\n />\n )}\n </ComposedChart>\n </ChartPlot>\n </>\n );\n}\n\ntype ColumnLabelProps = LabelProps & {\n row: MetricsStackedBarChartProps['data'][number] | undefined;\n keys: string[];\n self: number;\n color: string;\n};\n\nfunction paintedTop(values: number[], self: number, box: SegmentBox) {\n if (values.length > 1) return stackedSegmentBox(values, self, box, { gap: SEGMENT_GAP })?.y;\n return singleBarBox(values[self] ?? 0, box)?.y;\n}\n\nfunction ColumnLabel({ x, y, width, height, value, row, keys, self, color }: ColumnLabelProps) {\n if (value === undefined || value === null || value === '') return null;\n const values = keys.map(key => Number(row?.[key]) || 0);\n const topmost = values.findLastIndex(v => v > 0);\n if (self !== (topmost === -1 ? keys.length - 1 : topmost)) return null;\n const top = paintedTop(values, self, { y: Number(y), height: Math.max(Number(height), 0) }) ?? Number(y);\n return (\n <text\n x={Number(x) + Number(width) / 2}\n y={top - 6}\n textAnchor=\"middle\"\n fontSize={CHART_AXIS_FONT_SIZE}\n fill={color}\n className=\"tabular-nums\"\n >\n {String(value)}\n </text>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -17,6 +17,10 @@ export type TracesListViewTrace = {
17
17
  /** Server-rendered preview of `input`. Present on lightweight rows, which omit `input` itself. */
18
18
  inputPreview?: string | null;
19
19
  input?: unknown;
20
+ /** Server-rendered preview of the root span's output. */
21
+ outputPreview?: string;
22
+ /** Server-rendered preview of the root span's error. Shown in place of the output when `status` is `'error'`. */
23
+ errorPreview?: string;
20
24
  metadata?: Record<string, unknown> | null;
21
25
  startedAt?: Date | string | null;
22
26
  endedAt?: Date | string | null;
@@ -1,5 +1,5 @@
1
1
  import { TraceUsageSummary } from '@mastra/react/hooks/traces';
2
- export declare const TRACE_OPTIONAL_COLUMNS: readonly ["type", "input", "duration", "endTime", "environment", "inputTokens", "outputTokens", "totalTokens", "estimatedCost"];
2
+ export declare const TRACE_OPTIONAL_COLUMNS: readonly ["type", "input", "output", "duration", "endTime", "environment", "inputTokens", "outputTokens", "totalTokens", "estimatedCost"];
3
3
  export type TraceOptionalColumn = (typeof TRACE_OPTIONAL_COLUMNS)[number];
4
4
  export declare const TRACE_USAGE_COLUMNS: readonly ["inputTokens", "outputTokens", "totalTokens", "estimatedCost"];
5
5
  /** Trace properties that are not regular columns but can be pinned as a custom column. */
@@ -11,6 +11,13 @@ export interface TracesDataListInputCellProps {
11
11
  input?: string | null;
12
12
  }
13
13
  export declare function TracesDataListInputCell({ input }: TracesDataListInputCellProps): import("react").JSX.Element;
14
+ export interface TracesDataListOutputCellProps {
15
+ output?: string;
16
+ /** Shown instead of `output`, in the error color, when `status` is `'error'`. */
17
+ error?: string;
18
+ status?: string | null;
19
+ }
20
+ export declare function TracesDataListOutputCell({ output, error, status }: TracesDataListOutputCellProps): import("react").JSX.Element;
14
21
  export interface TracesDataListTypeCellProps {
15
22
  entityType?: string | null;
16
23
  }
@@ -8,7 +8,7 @@ import { DataListSpacer } from '../data-list-spacer';
8
8
  import { DataListSubHeading } from '../data-list-subheading';
9
9
  import { DataListTop } from '../data-list-top';
10
10
  import { DataListTopCellWithTooltip } from '../data-list-top-cell';
11
- import { TracesDataListNameCell, TracesDataListInputCell, TracesDataListTypeCell, TracesDataListStatusCell } from './traces-data-list-cells';
11
+ import { TracesDataListNameCell, TracesDataListInputCell, TracesDataListOutputCell, TracesDataListTypeCell, TracesDataListStatusCell } from './traces-data-list-cells';
12
12
  declare function TracesDataListRoot(props: ComponentProps<typeof DataListRoot>): import("react").JSX.Element;
13
13
  export declare const TracesDataList: typeof TracesDataListRoot & {
14
14
  Top: typeof DataListTop;
@@ -29,6 +29,7 @@ export declare const TracesDataList: typeof TracesDataListRoot & {
29
29
  CreatedCell: typeof DataListCreatedCell;
30
30
  NameCell: typeof TracesDataListNameCell;
31
31
  InputCell: typeof TracesDataListInputCell;
32
+ OutputCell: typeof TracesDataListOutputCell;
32
33
  TypeCell: typeof TracesDataListTypeCell;
33
34
  StatusCell: typeof TracesDataListStatusCell;
34
35
  NextPageLoading: typeof DataListNextPageLoading;
@@ -0,0 +1,2 @@
1
+ export * from './meter';
2
+ export * from './meter-source';
@@ -0,0 +1,6 @@
1
+ export type MeterPart = 'bar' | 'key';
2
+ export declare const MeterPartContext: import('react').Context<{
3
+ part: MeterPart;
4
+ format: (value: number) => string;
5
+ }>;
6
+ export declare const sourceColorClassName: string;
@@ -0,0 +1,6 @@
1
+ import { ReactNode } from 'react';
2
+ export declare function MeterKeyRow({ swatch, label, amount }: {
3
+ swatch: string;
4
+ label: ReactNode;
5
+ amount: string;
6
+ }): import("react").JSX.Element;
@@ -0,0 +1,14 @@
1
+ import { ComponentProps, ReactNode } from 'react';
2
+ export type MeterProps = Omit<ComponentProps<'span'>, 'children'> & {
3
+ value: number;
4
+ max: number;
5
+ children?: ReactNode;
6
+ format?: (value: number) => string;
7
+ } & ({
8
+ 'aria-label': string;
9
+ 'aria-labelledby'?: never;
10
+ } | {
11
+ 'aria-label'?: never;
12
+ 'aria-labelledby': string;
13
+ });
14
+ export declare function MeterRoot({ value, max, children, format, className, ...props }: MeterProps): import("react").JSX.Element;
@@ -0,0 +1,5 @@
1
+ export declare function MeterSegment({ slot, grow, className }: {
2
+ slot: string;
3
+ grow: number;
4
+ className: string;
5
+ }): import("react").JSX.Element;
@@ -0,0 +1,6 @@
1
+ import { ReactNode } from 'react';
2
+ export type MeterSourceProps = {
3
+ label: ReactNode;
4
+ value: number;
5
+ };
6
+ export declare function MeterSource({ label, value }: MeterSourceProps): import("react").JSX.Element;
@@ -0,0 +1,6 @@
1
+ import { MeterRoot } from './meter-root';
2
+ import { MeterSource } from './meter-source';
3
+ export type { MeterProps } from './meter-root';
4
+ export declare const Meter: typeof MeterRoot & {
5
+ Source: typeof MeterSource;
6
+ };
@@ -42,6 +42,7 @@ export type MetricsStackedBarChartProps = {
42
42
  xLabels?: ChartXLabels;
43
43
  /** Row field for the tooltip heading (e.g. a longer date); defaults to the x-axis label. */
44
44
  tooltipLabelKey?: string;
45
+ columnLabelKey?: string;
45
46
  /** Click a column (e.g. to open its traces); the plot shows a pointer cursor. */
46
47
  onBucketClick?: (row: Record<string, unknown>, index: number) => void;
47
48
  /** One dashed line over the bars, on its own hidden scale (e.g. a duration over counts). */
@@ -25,8 +25,10 @@ export declare namespace Table {
25
25
  var SortButton: typeof TableSortButton;
26
26
  var Pagination: typeof TablePagination;
27
27
  }
28
- export type TableHeaderProps = ComponentProps<'thead'>;
29
- declare function TableHeader({ className, ...props }: TableHeaderProps): import("react").JSX.Element;
28
+ export type TableHeaderProps = ComponentProps<'thead'> & {
29
+ placement?: 'above' | 'inside';
30
+ };
31
+ declare function TableHeader({ className, placement, ...props }: TableHeaderProps): import("react").JSX.Element;
30
32
  export interface TheadProps {
31
33
  className?: string;
32
34
  children: ReactNode;