@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
@@ -7,7 +7,7 @@ const dataListSkeleton = require('../data-list-skeleton-DGMTqeNP.cjs');
7
7
  const jsxRuntime = require('react/jsx-runtime');
8
8
  const Txt = require('../Txt-CIS2G5Jx.cjs');
9
9
  const utils_dateFormat = require('../utils/date-format.cjs.js');
10
- const tracesDataList = require('../traces-data-list-CHREkLv0.cjs');
10
+ const tracesDataList = require('../traces-data-list-BH24OVKh.cjs');
11
11
  const useDataListKeyboard = require('../use-data-list-keyboard-DF3tLe10.cjs');
12
12
  const layout_tabbedContainer = require('../layout/tabbed-container.cjs.js');
13
13
 
@@ -4,7 +4,7 @@ export { D as DataListSkeleton, a as DataListSkeletonRows } from '../data-list-s
4
4
  import { jsx } from 'react/jsx-runtime';
5
5
  import { T as Txt } from '../Txt-BtIGLRk1.js';
6
6
  import { formatDate } from '../utils/date-format.es.js';
7
- export { T as TracesDataList } from '../traces-data-list-BgloVIVi.js';
7
+ export { T as TracesDataList } from '../traces-data-list-BOJB37dV.js';
8
8
  export { u as useDataListKeyboard } from '../use-data-list-keyboard-DFQr4t38.js';
9
9
  export { TabbedContainer } from '../layout/tabbed-container.es.js';
10
10
 
@@ -0,0 +1,172 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
+
5
+ const jsxRuntime = require('react/jsx-runtime');
6
+ const React = require('react');
7
+ const utils_cost = require('../utils/cost.cjs.js');
8
+ const Txt = require('../Txt-CIS2G5Jx.cjs');
9
+ const utils_cn = require('../cn-DlOJCxrS.cjs');
10
+ const tooltip = require('../tooltip-BppwIf6Y.cjs');
11
+ const primitives_transitions = require('../primitives/transitions.cjs.js');
12
+
13
+ const MeterPartContext = React.createContext({
14
+ part: "bar",
15
+ format: utils_cost.formatFullNumber
16
+ });
17
+ const sourceColorClassName = [
18
+ "[&>:nth-child(5n+1)]:[--meter-source:var(--chart-share-1)]",
19
+ "[&>:nth-child(5n+2)]:[--meter-source:var(--chart-share-2)]",
20
+ "[&>:nth-child(5n+3)]:[--meter-source:var(--chart-share-3)]",
21
+ "[&>:nth-child(5n+4)]:[--meter-source:var(--chart-share-4)]",
22
+ "[&>:nth-child(5n)]:[--meter-source:var(--chart-share-5)]"
23
+ ].join(" ");
24
+
25
+ function MeterKeyRow({ swatch, label, amount }) {
26
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-slot": "meter-key-row", className: "flex items-center gap-2", children: [
27
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": true, className: utils_cn.cn("size-2 rounded-xs", swatch) }),
28
+ /* @__PURE__ */ jsxRuntime.jsx(Txt.Txt, { as: "span", variant: "caption", tone: "muted", className: "max-w-48 min-w-0 flex-1 truncate", children: label }),
29
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-auto pl-4 text-foreground tabular-nums", children: amount })
30
+ ] });
31
+ }
32
+
33
+ function MeterSegment({ slot, grow, className }) {
34
+ const style = { "--meter-share": grow };
35
+ return /* @__PURE__ */ jsxRuntime.jsx(
36
+ "span",
37
+ {
38
+ "data-slot": slot,
39
+ className: utils_cn.cn("min-w-1 grow-(--meter-share) basis-0 rounded-full", className),
40
+ style
41
+ }
42
+ );
43
+ }
44
+
45
+ function readingOf(value, max) {
46
+ const used = Math.max(0, value);
47
+ const allowance = Math.max(0, max);
48
+ const over = Math.max(0, used - allowance);
49
+ const within = used - over;
50
+ return { used, allowance, over, within, rest: allowance - within };
51
+ }
52
+ function overAllowanceText({ used, allowance, over }, format) {
53
+ if (over <= 0) return void 0;
54
+ return `${format(used)} of ${format(allowance)}, ${format(over)} over`;
55
+ }
56
+ function MeterRoot({ value, max, children, format = utils_cost.formatFullNumber, className, ...props }) {
57
+ const reading = readingOf(value, max);
58
+ const meterProps = {
59
+ role: "meter",
60
+ "aria-valuemin": 0,
61
+ "aria-valuemax": reading.allowance,
62
+ "aria-valuenow": reading.within,
63
+ "aria-valuetext": overAllowanceText(reading, format),
64
+ "data-over": reading.over > 0 || void 0,
65
+ className: utils_cn.cn("group/meter relative flex h-1 w-full min-w-0", className),
66
+ ...props
67
+ };
68
+ if (children === void 0) {
69
+ return /* @__PURE__ */ jsxRuntime.jsx("span", { ...meterProps, children: /* @__PURE__ */ jsxRuntime.jsx(AllowanceBar, { reading }) });
70
+ }
71
+ return /* @__PURE__ */ jsxRuntime.jsx(SourcesMeter, { reading, format, meterProps, children });
72
+ }
73
+ function SourcesMeter({
74
+ reading,
75
+ format,
76
+ meterProps,
77
+ children
78
+ }) {
79
+ const keyId = React.useId();
80
+ return /* @__PURE__ */ jsxRuntime.jsxs(tooltip.Tooltip, { children: [
81
+ /* @__PURE__ */ jsxRuntime.jsxs(
82
+ tooltip.TooltipTrigger,
83
+ {
84
+ delay: 0,
85
+ render: /* @__PURE__ */ jsxRuntime.jsx(
86
+ "span",
87
+ {
88
+ ...meterProps,
89
+ tabIndex: 0,
90
+ "aria-describedby": keyId,
91
+ className: utils_cn.cn(
92
+ meterProps.className,
93
+ "rounded-full before:absolute before:inset-x-0 before:-inset-y-2",
94
+ primitives_transitions.focusRing
95
+ )
96
+ }
97
+ ),
98
+ children: [
99
+ /* @__PURE__ */ jsxRuntime.jsx(AllowanceBar, { reading, className: utils_cn.cn(fadeOut, primitives_transitions.transitions.opacity, "motion-reduce:transition-none") }),
100
+ /* @__PURE__ */ jsxRuntime.jsx(SourceBar, { reading, format, children })
101
+ ]
102
+ }
103
+ ),
104
+ /* @__PURE__ */ jsxRuntime.jsx(tooltip.TooltipContent, { keepMounted: true, id: keyId, children: /* @__PURE__ */ jsxRuntime.jsx(MeterKey, { reading, format, children }) })
105
+ ] });
106
+ }
107
+ const fadeOut = "group-hover/meter:opacity-0 group-focus-visible/meter:opacity-0";
108
+ const fadeIn = "opacity-0 group-hover/meter:opacity-100 group-focus-visible/meter:opacity-100";
109
+ function AllowanceBar({ reading, className }) {
110
+ const { used, over, within, rest } = reading;
111
+ return /* @__PURE__ */ jsxRuntime.jsxs("span", { "data-slot": "meter-bar", className: utils_cn.cn("flex size-full gap-0.5", className), children: [
112
+ within > 0 && /* @__PURE__ */ jsxRuntime.jsx(MeterSegment, { slot: "meter-used", grow: within, className: "bg-foreground" }),
113
+ over > 0 && /* @__PURE__ */ jsxRuntime.jsx(MeterSegment, { slot: "meter-over", grow: over, className: "bg-destructive-indicator" }),
114
+ (rest > 0 || used === 0) && /* @__PURE__ */ jsxRuntime.jsx(MeterSegment, { slot: "meter-rest", grow: rest || 1, className: "bg-fill-strong" })
115
+ ] });
116
+ }
117
+ function SourceBar({
118
+ reading,
119
+ format,
120
+ children
121
+ }) {
122
+ const { used, over, rest } = reading;
123
+ const overShare = used > 0 ? over / used : 0;
124
+ const overStyle = { "--meter-over": `${overShare * 100}%` };
125
+ return /* @__PURE__ */ jsxRuntime.jsxs(
126
+ "span",
127
+ {
128
+ "aria-hidden": true,
129
+ "data-slot": "meter-sources",
130
+ style: overStyle,
131
+ className: utils_cn.cn(
132
+ "absolute inset-0 flex gap-0.5",
133
+ fadeIn,
134
+ primitives_transitions.transitions.opacity,
135
+ "motion-reduce:transition-none",
136
+ sourceColorClassName
137
+ ),
138
+ children: [
139
+ /* @__PURE__ */ jsxRuntime.jsx(MeterPartContext, { value: { part: "bar", format }, children }),
140
+ rest > 0 && /* @__PURE__ */ jsxRuntime.jsx(MeterSegment, { slot: "meter-rest", grow: rest, className: "bg-fill-strong" }),
141
+ over > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
142
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "absolute inset-y-0 right-0 w-(--meter-over) rounded-r-full bg-destructive-indicator" }),
143
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "absolute -inset-y-1 right-(--meter-over) w-0.5 rounded-full bg-foreground" })
144
+ ] })
145
+ ]
146
+ }
147
+ );
148
+ }
149
+ function MeterKey({
150
+ reading,
151
+ format,
152
+ children
153
+ }) {
154
+ const { over, rest } = reading;
155
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-slot": "meter-key", className: utils_cn.cn("flex min-w-40 flex-col gap-1", sourceColorClassName), children: [
156
+ /* @__PURE__ */ jsxRuntime.jsx(MeterPartContext, { value: { part: "key", format }, children }),
157
+ rest > 0 && /* @__PURE__ */ jsxRuntime.jsx(MeterKeyRow, { swatch: "bg-fill-strong", label: "Remaining", amount: format(rest) }),
158
+ over > 0 && /* @__PURE__ */ jsxRuntime.jsx(MeterKeyRow, { swatch: "bg-destructive-indicator", label: "Over allowance", amount: format(over) })
159
+ ] });
160
+ }
161
+
162
+ function MeterSource({ label, value }) {
163
+ const { part, format } = React.use(MeterPartContext);
164
+ if (part === "key") return /* @__PURE__ */ jsxRuntime.jsx(MeterKeyRow, { swatch: "bg-(--meter-source)", label, amount: format(value) });
165
+ return /* @__PURE__ */ jsxRuntime.jsx(MeterSegment, { slot: "meter-source", grow: Math.max(0, value), className: "bg-(--meter-source)" });
166
+ }
167
+
168
+ const Meter = Object.assign(MeterRoot, { Source: MeterSource });
169
+
170
+ exports.Meter = Meter;
171
+ exports.MeterSource = MeterSource;
172
+ //# sourceMappingURL=Meter.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Meter.cjs.js","sources":["../../src/ds/components/Meter/meter-context.ts","../../src/ds/components/Meter/meter-key-row.tsx","../../src/ds/components/Meter/meter-segment.tsx","../../src/ds/components/Meter/meter-root.tsx","../../src/ds/components/Meter/meter-source.tsx","../../src/ds/components/Meter/meter.tsx"],"sourcesContent":["import { createContext } from 'react';\nimport { formatFullNumber } from '@/lib/cost';\n\nexport type MeterPart = 'bar' | 'key';\n\nexport const MeterPartContext = createContext<{ part: MeterPart; format: (value: number) => string }>({\n part: 'bar',\n format: formatFullNumber,\n});\n\nexport const sourceColorClassName = [\n '[&>:nth-child(5n+1)]:[--meter-source:var(--chart-share-1)]',\n '[&>:nth-child(5n+2)]:[--meter-source:var(--chart-share-2)]',\n '[&>:nth-child(5n+3)]:[--meter-source:var(--chart-share-3)]',\n '[&>:nth-child(5n+4)]:[--meter-source:var(--chart-share-4)]',\n '[&>:nth-child(5n)]:[--meter-source:var(--chart-share-5)]',\n].join(' ');\n","import type { ReactNode } from 'react';\nimport { Txt } from '@/ds/components/Txt';\nimport { cn } from '@/lib/utils';\n\nexport function MeterKeyRow({ swatch, label, amount }: { swatch: string; label: ReactNode; amount: string }) {\n return (\n <div data-slot=\"meter-key-row\" className=\"flex items-center gap-2\">\n <span aria-hidden className={cn('size-2 rounded-xs', swatch)} />\n <Txt as=\"span\" variant=\"caption\" tone=\"muted\" className=\"max-w-48 min-w-0 flex-1 truncate\">\n {label}\n </Txt>\n <span className=\"ml-auto pl-4 text-foreground tabular-nums\">{amount}</span>\n </div>\n );\n}\n","import type { CSSProperties } from 'react';\nimport { cn } from '@/lib/utils';\n\ninterface SegmentStyle extends CSSProperties {\n '--meter-share': number;\n}\n\nexport function MeterSegment({ slot, grow, className }: { slot: string; grow: number; className: string }) {\n const style: SegmentStyle = { '--meter-share': grow };\n return (\n <span\n data-slot={slot}\n className={cn('min-w-1 grow-(--meter-share) basis-0 rounded-full', className)}\n style={style}\n />\n );\n}\n","import { useId } from 'react';\nimport type { CSSProperties, ComponentProps, ReactNode } from 'react';\nimport { MeterPartContext, sourceColorClassName } from './meter-context';\nimport { MeterKeyRow } from './meter-key-row';\nimport { MeterSegment } from './meter-segment';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@/ds/components/Tooltip/tooltip';\nimport { focusRing, transitions } from '@/ds/primitives/transitions';\nimport { formatFullNumber } from '@/lib/cost';\nimport { cn } from '@/lib/utils';\n\nexport type MeterProps = Omit<ComponentProps<'span'>, 'children'> & {\n value: number;\n max: number;\n children?: ReactNode;\n format?: (value: number) => string;\n} & ({ 'aria-label': string; 'aria-labelledby'?: never } | { 'aria-label'?: never; 'aria-labelledby': string });\n\ntype Reading = { used: number; allowance: number; over: number; within: number; rest: number };\n\nfunction readingOf(value: number, max: number): Reading {\n const used = Math.max(0, value);\n const allowance = Math.max(0, max);\n const over = Math.max(0, used - allowance);\n const within = used - over;\n return { used, allowance, over, within, rest: allowance - within };\n}\n\nfunction overAllowanceText({ used, allowance, over }: Reading, format: (value: number) => string) {\n if (over <= 0) return undefined;\n return `${format(used)} of ${format(allowance)}, ${format(over)} over`;\n}\n\nexport function MeterRoot({ value, max, children, format = formatFullNumber, className, ...props }: MeterProps) {\n const reading = readingOf(value, max);\n const meterProps = {\n role: 'meter',\n 'aria-valuemin': 0,\n 'aria-valuemax': reading.allowance,\n 'aria-valuenow': reading.within,\n 'aria-valuetext': overAllowanceText(reading, format),\n 'data-over': reading.over > 0 || undefined,\n className: cn('group/meter relative flex h-1 w-full min-w-0', className),\n ...props,\n };\n\n if (children === undefined) {\n return (\n <span {...meterProps}>\n <AllowanceBar reading={reading} />\n </span>\n );\n }\n\n return (\n <SourcesMeter reading={reading} format={format} meterProps={meterProps}>\n {children}\n </SourcesMeter>\n );\n}\n\nfunction SourcesMeter({\n reading,\n format,\n meterProps,\n children,\n}: {\n reading: Reading;\n format: (value: number) => string;\n meterProps: ComponentProps<'span'>;\n children: ReactNode;\n}) {\n const keyId = useId();\n return (\n <Tooltip>\n <TooltipTrigger\n delay={0}\n render={\n <span\n {...meterProps}\n tabIndex={0}\n aria-describedby={keyId}\n className={cn(\n meterProps.className,\n 'rounded-full before:absolute before:inset-x-0 before:-inset-y-2',\n focusRing,\n )}\n />\n }\n >\n <AllowanceBar reading={reading} className={cn(fadeOut, transitions.opacity, 'motion-reduce:transition-none')} />\n <SourceBar reading={reading} format={format}>\n {children}\n </SourceBar>\n </TooltipTrigger>\n <TooltipContent keepMounted id={keyId}>\n <MeterKey reading={reading} format={format}>\n {children}\n </MeterKey>\n </TooltipContent>\n </Tooltip>\n );\n}\n\nconst fadeOut = 'group-hover/meter:opacity-0 group-focus-visible/meter:opacity-0';\nconst fadeIn = 'opacity-0 group-hover/meter:opacity-100 group-focus-visible/meter:opacity-100';\n\nfunction AllowanceBar({ reading, className }: { reading: Reading; className?: string }) {\n const { used, over, within, rest } = reading;\n return (\n <span data-slot=\"meter-bar\" className={cn('flex size-full gap-0.5', className)}>\n {within > 0 && <MeterSegment slot=\"meter-used\" grow={within} className=\"bg-foreground\" />}\n {over > 0 && <MeterSegment slot=\"meter-over\" grow={over} className=\"bg-destructive-indicator\" />}\n {(rest > 0 || used === 0) && <MeterSegment slot=\"meter-rest\" grow={rest || 1} className=\"bg-fill-strong\" />}\n </span>\n );\n}\n\ninterface OverStyle extends CSSProperties {\n '--meter-over': string;\n}\n\nfunction SourceBar({\n reading,\n format,\n children,\n}: {\n reading: Reading;\n format: (value: number) => string;\n children: ReactNode;\n}) {\n const { used, over, rest } = reading;\n const overShare = used > 0 ? over / used : 0;\n const overStyle: OverStyle = { '--meter-over': `${overShare * 100}%` };\n return (\n <span\n aria-hidden\n data-slot=\"meter-sources\"\n style={overStyle}\n className={cn(\n 'absolute inset-0 flex gap-0.5',\n fadeIn,\n transitions.opacity,\n 'motion-reduce:transition-none',\n sourceColorClassName,\n )}\n >\n <MeterPartContext value={{ part: 'bar', format }}>{children}</MeterPartContext>\n {rest > 0 && <MeterSegment slot=\"meter-rest\" grow={rest} className=\"bg-fill-strong\" />}\n {over > 0 && (\n <>\n <span className=\"absolute inset-y-0 right-0 w-(--meter-over) rounded-r-full bg-destructive-indicator\" />\n <span className=\"absolute -inset-y-1 right-(--meter-over) w-0.5 rounded-full bg-foreground\" />\n </>\n )}\n </span>\n );\n}\n\nfunction MeterKey({\n reading,\n format,\n children,\n}: {\n reading: Reading;\n format: (value: number) => string;\n children: ReactNode;\n}) {\n const { over, rest } = reading;\n return (\n <div data-slot=\"meter-key\" className={cn('flex min-w-40 flex-col gap-1', sourceColorClassName)}>\n <MeterPartContext value={{ part: 'key', format }}>{children}</MeterPartContext>\n {rest > 0 && <MeterKeyRow swatch=\"bg-fill-strong\" label=\"Remaining\" amount={format(rest)} />}\n {over > 0 && <MeterKeyRow swatch=\"bg-destructive-indicator\" label=\"Over allowance\" amount={format(over)} />}\n </div>\n );\n}\n","import { use } from 'react';\nimport type { ReactNode } from 'react';\nimport { MeterPartContext } from './meter-context';\nimport { MeterKeyRow } from './meter-key-row';\nimport { MeterSegment } from './meter-segment';\n\nexport type MeterSourceProps = {\n label: ReactNode;\n value: number;\n};\n\nexport function MeterSource({ label, value }: MeterSourceProps) {\n const { part, format } = use(MeterPartContext);\n if (part === 'key') return <MeterKeyRow swatch=\"bg-(--meter-source)\" label={label} amount={format(value)} />;\n return <MeterSegment slot=\"meter-source\" grow={Math.max(0, value)} className=\"bg-(--meter-source)\" />;\n}\n","import { MeterRoot } from './meter-root';\nimport { MeterSource } from './meter-source';\n\nexport type { MeterProps } from './meter-root';\n\nexport const Meter = Object.assign(MeterRoot, { Source: MeterSource });\n"],"names":["createContext","formatFullNumber","jsxs","jsx","cn","Txt","useId","Tooltip","TooltipTrigger","focusRing","transitions","TooltipContent","Fragment","use"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from '../src/ds/components/Meter/index'
2
+ export {}
@@ -0,0 +1,167 @@
1
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
+ import { createContext, useId, use } from 'react';
3
+ import { formatFullNumber } from '../utils/cost.es.js';
4
+ import { T as Txt } from '../Txt-BtIGLRk1.js';
5
+ import { c as cn } from '../cn-CQUhN5Jx.js';
6
+ import { T as Tooltip, c as TooltipTrigger, a as TooltipContent } from '../tooltip-DrsXZDAj.js';
7
+ import { transitions, focusRing } from '../primitives/transitions.es.js';
8
+
9
+ const MeterPartContext = createContext({
10
+ part: "bar",
11
+ format: formatFullNumber
12
+ });
13
+ const sourceColorClassName = [
14
+ "[&>:nth-child(5n+1)]:[--meter-source:var(--chart-share-1)]",
15
+ "[&>:nth-child(5n+2)]:[--meter-source:var(--chart-share-2)]",
16
+ "[&>:nth-child(5n+3)]:[--meter-source:var(--chart-share-3)]",
17
+ "[&>:nth-child(5n+4)]:[--meter-source:var(--chart-share-4)]",
18
+ "[&>:nth-child(5n)]:[--meter-source:var(--chart-share-5)]"
19
+ ].join(" ");
20
+
21
+ function MeterKeyRow({ swatch, label, amount }) {
22
+ return /* @__PURE__ */ jsxs("div", { "data-slot": "meter-key-row", className: "flex items-center gap-2", children: [
23
+ /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: cn("size-2 rounded-xs", swatch) }),
24
+ /* @__PURE__ */ jsx(Txt, { as: "span", variant: "caption", tone: "muted", className: "max-w-48 min-w-0 flex-1 truncate", children: label }),
25
+ /* @__PURE__ */ jsx("span", { className: "ml-auto pl-4 text-foreground tabular-nums", children: amount })
26
+ ] });
27
+ }
28
+
29
+ function MeterSegment({ slot, grow, className }) {
30
+ const style = { "--meter-share": grow };
31
+ return /* @__PURE__ */ jsx(
32
+ "span",
33
+ {
34
+ "data-slot": slot,
35
+ className: cn("min-w-1 grow-(--meter-share) basis-0 rounded-full", className),
36
+ style
37
+ }
38
+ );
39
+ }
40
+
41
+ function readingOf(value, max) {
42
+ const used = Math.max(0, value);
43
+ const allowance = Math.max(0, max);
44
+ const over = Math.max(0, used - allowance);
45
+ const within = used - over;
46
+ return { used, allowance, over, within, rest: allowance - within };
47
+ }
48
+ function overAllowanceText({ used, allowance, over }, format) {
49
+ if (over <= 0) return void 0;
50
+ return `${format(used)} of ${format(allowance)}, ${format(over)} over`;
51
+ }
52
+ function MeterRoot({ value, max, children, format = formatFullNumber, className, ...props }) {
53
+ const reading = readingOf(value, max);
54
+ const meterProps = {
55
+ role: "meter",
56
+ "aria-valuemin": 0,
57
+ "aria-valuemax": reading.allowance,
58
+ "aria-valuenow": reading.within,
59
+ "aria-valuetext": overAllowanceText(reading, format),
60
+ "data-over": reading.over > 0 || void 0,
61
+ className: cn("group/meter relative flex h-1 w-full min-w-0", className),
62
+ ...props
63
+ };
64
+ if (children === void 0) {
65
+ return /* @__PURE__ */ jsx("span", { ...meterProps, children: /* @__PURE__ */ jsx(AllowanceBar, { reading }) });
66
+ }
67
+ return /* @__PURE__ */ jsx(SourcesMeter, { reading, format, meterProps, children });
68
+ }
69
+ function SourcesMeter({
70
+ reading,
71
+ format,
72
+ meterProps,
73
+ children
74
+ }) {
75
+ const keyId = useId();
76
+ return /* @__PURE__ */ jsxs(Tooltip, { children: [
77
+ /* @__PURE__ */ jsxs(
78
+ TooltipTrigger,
79
+ {
80
+ delay: 0,
81
+ render: /* @__PURE__ */ jsx(
82
+ "span",
83
+ {
84
+ ...meterProps,
85
+ tabIndex: 0,
86
+ "aria-describedby": keyId,
87
+ className: cn(
88
+ meterProps.className,
89
+ "rounded-full before:absolute before:inset-x-0 before:-inset-y-2",
90
+ focusRing
91
+ )
92
+ }
93
+ ),
94
+ children: [
95
+ /* @__PURE__ */ jsx(AllowanceBar, { reading, className: cn(fadeOut, transitions.opacity, "motion-reduce:transition-none") }),
96
+ /* @__PURE__ */ jsx(SourceBar, { reading, format, children })
97
+ ]
98
+ }
99
+ ),
100
+ /* @__PURE__ */ jsx(TooltipContent, { keepMounted: true, id: keyId, children: /* @__PURE__ */ jsx(MeterKey, { reading, format, children }) })
101
+ ] });
102
+ }
103
+ const fadeOut = "group-hover/meter:opacity-0 group-focus-visible/meter:opacity-0";
104
+ const fadeIn = "opacity-0 group-hover/meter:opacity-100 group-focus-visible/meter:opacity-100";
105
+ function AllowanceBar({ reading, className }) {
106
+ const { used, over, within, rest } = reading;
107
+ return /* @__PURE__ */ jsxs("span", { "data-slot": "meter-bar", className: cn("flex size-full gap-0.5", className), children: [
108
+ within > 0 && /* @__PURE__ */ jsx(MeterSegment, { slot: "meter-used", grow: within, className: "bg-foreground" }),
109
+ over > 0 && /* @__PURE__ */ jsx(MeterSegment, { slot: "meter-over", grow: over, className: "bg-destructive-indicator" }),
110
+ (rest > 0 || used === 0) && /* @__PURE__ */ jsx(MeterSegment, { slot: "meter-rest", grow: rest || 1, className: "bg-fill-strong" })
111
+ ] });
112
+ }
113
+ function SourceBar({
114
+ reading,
115
+ format,
116
+ children
117
+ }) {
118
+ const { used, over, rest } = reading;
119
+ const overShare = used > 0 ? over / used : 0;
120
+ const overStyle = { "--meter-over": `${overShare * 100}%` };
121
+ return /* @__PURE__ */ jsxs(
122
+ "span",
123
+ {
124
+ "aria-hidden": true,
125
+ "data-slot": "meter-sources",
126
+ style: overStyle,
127
+ className: cn(
128
+ "absolute inset-0 flex gap-0.5",
129
+ fadeIn,
130
+ transitions.opacity,
131
+ "motion-reduce:transition-none",
132
+ sourceColorClassName
133
+ ),
134
+ children: [
135
+ /* @__PURE__ */ jsx(MeterPartContext, { value: { part: "bar", format }, children }),
136
+ rest > 0 && /* @__PURE__ */ jsx(MeterSegment, { slot: "meter-rest", grow: rest, className: "bg-fill-strong" }),
137
+ over > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
138
+ /* @__PURE__ */ jsx("span", { className: "absolute inset-y-0 right-0 w-(--meter-over) rounded-r-full bg-destructive-indicator" }),
139
+ /* @__PURE__ */ jsx("span", { className: "absolute -inset-y-1 right-(--meter-over) w-0.5 rounded-full bg-foreground" })
140
+ ] })
141
+ ]
142
+ }
143
+ );
144
+ }
145
+ function MeterKey({
146
+ reading,
147
+ format,
148
+ children
149
+ }) {
150
+ const { over, rest } = reading;
151
+ return /* @__PURE__ */ jsxs("div", { "data-slot": "meter-key", className: cn("flex min-w-40 flex-col gap-1", sourceColorClassName), children: [
152
+ /* @__PURE__ */ jsx(MeterPartContext, { value: { part: "key", format }, children }),
153
+ rest > 0 && /* @__PURE__ */ jsx(MeterKeyRow, { swatch: "bg-fill-strong", label: "Remaining", amount: format(rest) }),
154
+ over > 0 && /* @__PURE__ */ jsx(MeterKeyRow, { swatch: "bg-destructive-indicator", label: "Over allowance", amount: format(over) })
155
+ ] });
156
+ }
157
+
158
+ function MeterSource({ label, value }) {
159
+ const { part, format } = use(MeterPartContext);
160
+ if (part === "key") return /* @__PURE__ */ jsx(MeterKeyRow, { swatch: "bg-(--meter-source)", label, amount: format(value) });
161
+ return /* @__PURE__ */ jsx(MeterSegment, { slot: "meter-source", grow: Math.max(0, value), className: "bg-(--meter-source)" });
162
+ }
163
+
164
+ const Meter = Object.assign(MeterRoot, { Source: MeterSource });
165
+
166
+ export { Meter, MeterSource };
167
+ //# sourceMappingURL=Meter.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Meter.es.js","sources":["../../src/ds/components/Meter/meter-context.ts","../../src/ds/components/Meter/meter-key-row.tsx","../../src/ds/components/Meter/meter-segment.tsx","../../src/ds/components/Meter/meter-root.tsx","../../src/ds/components/Meter/meter-source.tsx","../../src/ds/components/Meter/meter.tsx"],"sourcesContent":["import { createContext } from 'react';\nimport { formatFullNumber } from '@/lib/cost';\n\nexport type MeterPart = 'bar' | 'key';\n\nexport const MeterPartContext = createContext<{ part: MeterPart; format: (value: number) => string }>({\n part: 'bar',\n format: formatFullNumber,\n});\n\nexport const sourceColorClassName = [\n '[&>:nth-child(5n+1)]:[--meter-source:var(--chart-share-1)]',\n '[&>:nth-child(5n+2)]:[--meter-source:var(--chart-share-2)]',\n '[&>:nth-child(5n+3)]:[--meter-source:var(--chart-share-3)]',\n '[&>:nth-child(5n+4)]:[--meter-source:var(--chart-share-4)]',\n '[&>:nth-child(5n)]:[--meter-source:var(--chart-share-5)]',\n].join(' ');\n","import type { ReactNode } from 'react';\nimport { Txt } from '@/ds/components/Txt';\nimport { cn } from '@/lib/utils';\n\nexport function MeterKeyRow({ swatch, label, amount }: { swatch: string; label: ReactNode; amount: string }) {\n return (\n <div data-slot=\"meter-key-row\" className=\"flex items-center gap-2\">\n <span aria-hidden className={cn('size-2 rounded-xs', swatch)} />\n <Txt as=\"span\" variant=\"caption\" tone=\"muted\" className=\"max-w-48 min-w-0 flex-1 truncate\">\n {label}\n </Txt>\n <span className=\"ml-auto pl-4 text-foreground tabular-nums\">{amount}</span>\n </div>\n );\n}\n","import type { CSSProperties } from 'react';\nimport { cn } from '@/lib/utils';\n\ninterface SegmentStyle extends CSSProperties {\n '--meter-share': number;\n}\n\nexport function MeterSegment({ slot, grow, className }: { slot: string; grow: number; className: string }) {\n const style: SegmentStyle = { '--meter-share': grow };\n return (\n <span\n data-slot={slot}\n className={cn('min-w-1 grow-(--meter-share) basis-0 rounded-full', className)}\n style={style}\n />\n );\n}\n","import { useId } from 'react';\nimport type { CSSProperties, ComponentProps, ReactNode } from 'react';\nimport { MeterPartContext, sourceColorClassName } from './meter-context';\nimport { MeterKeyRow } from './meter-key-row';\nimport { MeterSegment } from './meter-segment';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@/ds/components/Tooltip/tooltip';\nimport { focusRing, transitions } from '@/ds/primitives/transitions';\nimport { formatFullNumber } from '@/lib/cost';\nimport { cn } from '@/lib/utils';\n\nexport type MeterProps = Omit<ComponentProps<'span'>, 'children'> & {\n value: number;\n max: number;\n children?: ReactNode;\n format?: (value: number) => string;\n} & ({ 'aria-label': string; 'aria-labelledby'?: never } | { 'aria-label'?: never; 'aria-labelledby': string });\n\ntype Reading = { used: number; allowance: number; over: number; within: number; rest: number };\n\nfunction readingOf(value: number, max: number): Reading {\n const used = Math.max(0, value);\n const allowance = Math.max(0, max);\n const over = Math.max(0, used - allowance);\n const within = used - over;\n return { used, allowance, over, within, rest: allowance - within };\n}\n\nfunction overAllowanceText({ used, allowance, over }: Reading, format: (value: number) => string) {\n if (over <= 0) return undefined;\n return `${format(used)} of ${format(allowance)}, ${format(over)} over`;\n}\n\nexport function MeterRoot({ value, max, children, format = formatFullNumber, className, ...props }: MeterProps) {\n const reading = readingOf(value, max);\n const meterProps = {\n role: 'meter',\n 'aria-valuemin': 0,\n 'aria-valuemax': reading.allowance,\n 'aria-valuenow': reading.within,\n 'aria-valuetext': overAllowanceText(reading, format),\n 'data-over': reading.over > 0 || undefined,\n className: cn('group/meter relative flex h-1 w-full min-w-0', className),\n ...props,\n };\n\n if (children === undefined) {\n return (\n <span {...meterProps}>\n <AllowanceBar reading={reading} />\n </span>\n );\n }\n\n return (\n <SourcesMeter reading={reading} format={format} meterProps={meterProps}>\n {children}\n </SourcesMeter>\n );\n}\n\nfunction SourcesMeter({\n reading,\n format,\n meterProps,\n children,\n}: {\n reading: Reading;\n format: (value: number) => string;\n meterProps: ComponentProps<'span'>;\n children: ReactNode;\n}) {\n const keyId = useId();\n return (\n <Tooltip>\n <TooltipTrigger\n delay={0}\n render={\n <span\n {...meterProps}\n tabIndex={0}\n aria-describedby={keyId}\n className={cn(\n meterProps.className,\n 'rounded-full before:absolute before:inset-x-0 before:-inset-y-2',\n focusRing,\n )}\n />\n }\n >\n <AllowanceBar reading={reading} className={cn(fadeOut, transitions.opacity, 'motion-reduce:transition-none')} />\n <SourceBar reading={reading} format={format}>\n {children}\n </SourceBar>\n </TooltipTrigger>\n <TooltipContent keepMounted id={keyId}>\n <MeterKey reading={reading} format={format}>\n {children}\n </MeterKey>\n </TooltipContent>\n </Tooltip>\n );\n}\n\nconst fadeOut = 'group-hover/meter:opacity-0 group-focus-visible/meter:opacity-0';\nconst fadeIn = 'opacity-0 group-hover/meter:opacity-100 group-focus-visible/meter:opacity-100';\n\nfunction AllowanceBar({ reading, className }: { reading: Reading; className?: string }) {\n const { used, over, within, rest } = reading;\n return (\n <span data-slot=\"meter-bar\" className={cn('flex size-full gap-0.5', className)}>\n {within > 0 && <MeterSegment slot=\"meter-used\" grow={within} className=\"bg-foreground\" />}\n {over > 0 && <MeterSegment slot=\"meter-over\" grow={over} className=\"bg-destructive-indicator\" />}\n {(rest > 0 || used === 0) && <MeterSegment slot=\"meter-rest\" grow={rest || 1} className=\"bg-fill-strong\" />}\n </span>\n );\n}\n\ninterface OverStyle extends CSSProperties {\n '--meter-over': string;\n}\n\nfunction SourceBar({\n reading,\n format,\n children,\n}: {\n reading: Reading;\n format: (value: number) => string;\n children: ReactNode;\n}) {\n const { used, over, rest } = reading;\n const overShare = used > 0 ? over / used : 0;\n const overStyle: OverStyle = { '--meter-over': `${overShare * 100}%` };\n return (\n <span\n aria-hidden\n data-slot=\"meter-sources\"\n style={overStyle}\n className={cn(\n 'absolute inset-0 flex gap-0.5',\n fadeIn,\n transitions.opacity,\n 'motion-reduce:transition-none',\n sourceColorClassName,\n )}\n >\n <MeterPartContext value={{ part: 'bar', format }}>{children}</MeterPartContext>\n {rest > 0 && <MeterSegment slot=\"meter-rest\" grow={rest} className=\"bg-fill-strong\" />}\n {over > 0 && (\n <>\n <span className=\"absolute inset-y-0 right-0 w-(--meter-over) rounded-r-full bg-destructive-indicator\" />\n <span className=\"absolute -inset-y-1 right-(--meter-over) w-0.5 rounded-full bg-foreground\" />\n </>\n )}\n </span>\n );\n}\n\nfunction MeterKey({\n reading,\n format,\n children,\n}: {\n reading: Reading;\n format: (value: number) => string;\n children: ReactNode;\n}) {\n const { over, rest } = reading;\n return (\n <div data-slot=\"meter-key\" className={cn('flex min-w-40 flex-col gap-1', sourceColorClassName)}>\n <MeterPartContext value={{ part: 'key', format }}>{children}</MeterPartContext>\n {rest > 0 && <MeterKeyRow swatch=\"bg-fill-strong\" label=\"Remaining\" amount={format(rest)} />}\n {over > 0 && <MeterKeyRow swatch=\"bg-destructive-indicator\" label=\"Over allowance\" amount={format(over)} />}\n </div>\n );\n}\n","import { use } from 'react';\nimport type { ReactNode } from 'react';\nimport { MeterPartContext } from './meter-context';\nimport { MeterKeyRow } from './meter-key-row';\nimport { MeterSegment } from './meter-segment';\n\nexport type MeterSourceProps = {\n label: ReactNode;\n value: number;\n};\n\nexport function MeterSource({ label, value }: MeterSourceProps) {\n const { part, format } = use(MeterPartContext);\n if (part === 'key') return <MeterKeyRow swatch=\"bg-(--meter-source)\" label={label} amount={format(value)} />;\n return <MeterSegment slot=\"meter-source\" grow={Math.max(0, value)} className=\"bg-(--meter-source)\" />;\n}\n","import { MeterRoot } from './meter-root';\nimport { MeterSource } from './meter-source';\n\nexport type { MeterProps } from './meter-root';\n\nexport const Meter = Object.assign(MeterRoot, { Source: MeterSource });\n"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
4
 
5
- const metricsStackedBarChart = require('../metrics-stacked-bar-chart-BijHfnOd.cjs');
5
+ const metricsStackedBarChart = require('../metrics-stacked-bar-chart-BofJ8NDc.cjs');
6
6
 
7
7
 
8
8
 
@@ -1,2 +1,2 @@
1
- export { M as MetricsStackedBarChart } from '../metrics-stacked-bar-chart-CdcENBLD.js';
1
+ export { M as MetricsStackedBarChart } from '../metrics-stacked-bar-chart-DcxHznKw.js';
2
2
  //# sourceMappingURL=MetricsStackedBarChart.es.js.map
@@ -221,14 +221,22 @@ function TableFrame({ variant, size = "default", className, columnDividers, ...p
221
221
  function Table({ variant = "default", ...props }) {
222
222
  return /* @__PURE__ */ jsxRuntime.jsx(TableVariantContext, { value: variant, children: /* @__PURE__ */ jsxRuntime.jsx(TableFrame, { variant, ...props }) });
223
223
  }
224
- function TableHeader({ className, ...props }) {
224
+ const insideHeaderStyles = [
225
+ "[&>tr>th]:border-b [&>tr>th]:bg-background [&>tr>th]:bg-clip-padding",
226
+ "[&>tr>th:first-child]:rounded-tl-lg [&>tr>th:last-child]:rounded-tr-lg"
227
+ ];
228
+ function TableHeader({ className, placement = "above", ...props }) {
225
229
  const variant = useTableVariant();
230
+ const inside = variant === "inset" && placement === "inside";
231
+ const headerPlacement = inside ? "inside" : void 0;
226
232
  return /* @__PURE__ */ jsxRuntime.jsx(
227
233
  "thead",
228
234
  {
229
235
  "data-slot": "table-header",
236
+ "data-placement": headerPlacement,
230
237
  className: utils_cn.cn(
231
238
  variant === "default" && "[&>tr]:h-table-header [&>tr]:border-b [&>tr]:border-border [&>tr]:bg-card",
239
+ inside && insideHeaderStyles,
232
240
  className
233
241
  ),
234
242
  ...props
@@ -266,6 +274,8 @@ const tableBodyStyles = [
266
274
  "[&>tr:first-child>td:first-child]:rounded-tl-lg",
267
275
  "[&>tr:first-child>td:last-child]:rounded-tr-lg",
268
276
  "[&>tr:first-child_[data-row-target]]:after:rounded-t-lg",
277
+ "[thead[data-placement=inside]+&>tr:first-child>td]:rounded-none",
278
+ "[thead[data-placement=inside]+&>tr:first-child_[data-row-target]]:after:rounded-none",
269
279
  "[&>tr:last-child_[data-row-target]]:after:rounded-b-lg",
270
280
  "[&_:is(a,button,input,select,textarea):not([data-row-target])]:relative",
271
281
  "[&_:is(a,button,input,select,textarea):not([data-row-target])]:z-1"