@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.
- package/dist/components/DataList.cjs.js +1 -1
- package/dist/components/DataList.es.js +1 -1
- package/dist/components/Meter.cjs.js +172 -0
- package/dist/components/Meter.cjs.js.map +1 -0
- package/dist/components/Meter.d.ts +2 -0
- package/dist/components/Meter.es.js +167 -0
- package/dist/components/Meter.es.js.map +1 -0
- package/dist/components/MetricsStackedBarChart.cjs.js +1 -1
- package/dist/components/MetricsStackedBarChart.es.js +1 -1
- package/dist/components/Table.cjs.js +11 -1
- package/dist/components/Table.cjs.js.map +1 -1
- package/dist/components/Table.es.js +11 -1
- package/dist/components/Table.es.js.map +1 -1
- package/dist/domains/chat/tools/badges/workflow-badge.cjs.js +0 -1
- package/dist/domains/chat/tools/badges/workflow-badge.cjs.js.map +1 -1
- package/dist/domains/chat/tools/badges/workflow-badge.es.js +0 -1
- package/dist/domains/chat/tools/badges/workflow-badge.es.js.map +1 -1
- package/dist/domains/metrics/components/agent-runs-card.cjs.js +1 -1
- package/dist/domains/metrics/components/agent-runs-card.es.js +1 -1
- package/dist/domains/metrics/components/token-usage-card.cjs.js +1 -1
- package/dist/domains/metrics/components/token-usage-card.es.js +1 -1
- package/dist/domains/traces/components/thread-view-by-trace.cjs.js +0 -1
- package/dist/domains/traces/components/thread-view-by-trace.cjs.js.map +1 -1
- package/dist/domains/traces/components/thread-view-by-trace.es.js +0 -1
- package/dist/domains/traces/components/thread-view-by-trace.es.js.map +1 -1
- package/dist/domains/traces/components/trace-columns-menu.cjs.js +9 -1
- package/dist/domains/traces/components/trace-columns-menu.cjs.js.map +1 -1
- package/dist/domains/traces/components/trace-columns-menu.es.js +9 -1
- package/dist/domains/traces/components/trace-columns-menu.es.js.map +1 -1
- package/dist/domains/traces/components/trace-data-panel.cjs.js +0 -1
- package/dist/domains/traces/components/trace-data-panel.cjs.js.map +1 -1
- package/dist/domains/traces/components/trace-data-panel.es.js +0 -1
- package/dist/domains/traces/components/trace-data-panel.es.js.map +1 -1
- package/dist/domains/traces/components/traces-list-view-adapter.cjs.js +2 -0
- package/dist/domains/traces/components/traces-list-view-adapter.cjs.js.map +1 -1
- package/dist/domains/traces/components/traces-list-view-adapter.es.js +2 -0
- package/dist/domains/traces/components/traces-list-view-adapter.es.js.map +1 -1
- package/dist/domains/traces/components/traces-list-view.cjs.js +10 -1
- package/dist/domains/traces/components/traces-list-view.cjs.js.map +1 -1
- package/dist/domains/traces/components/traces-list-view.es.js +10 -1
- package/dist/domains/traces/components/traces-list-view.es.js.map +1 -1
- package/dist/domains/traces/trace-list-columns.cjs.js +12 -4
- package/dist/domains/traces/trace-list-columns.cjs.js.map +1 -1
- package/dist/domains/traces/trace-list-columns.es.js +12 -4
- package/dist/domains/traces/trace-list-columns.es.js.map +1 -1
- package/dist/{metrics-stacked-bar-chart-BijHfnOd.cjs → metrics-stacked-bar-chart-BofJ8NDc.cjs} +45 -3
- package/dist/metrics-stacked-bar-chart-BofJ8NDc.cjs.map +1 -0
- package/dist/{metrics-stacked-bar-chart-CdcENBLD.js → metrics-stacked-bar-chart-DcxHznKw.js} +47 -5
- package/dist/metrics-stacked-bar-chart-DcxHznKw.js.map +1 -0
- package/dist/src/domains/traces/components/traces-list-view.d.ts +4 -0
- package/dist/src/domains/traces/trace-list-columns.d.ts +1 -1
- package/dist/src/ds/components/DataList/TracesDataList/traces-data-list-cells.d.ts +7 -0
- package/dist/src/ds/components/DataList/TracesDataList/traces-data-list.d.ts +2 -1
- package/dist/src/ds/components/Meter/index.d.ts +2 -0
- package/dist/src/ds/components/Meter/meter-context.d.ts +6 -0
- package/dist/src/ds/components/Meter/meter-key-row.d.ts +6 -0
- package/dist/src/ds/components/Meter/meter-root.d.ts +14 -0
- package/dist/src/ds/components/Meter/meter-segment.d.ts +5 -0
- package/dist/src/ds/components/Meter/meter-source.d.ts +6 -0
- package/dist/src/ds/components/Meter/meter.d.ts +6 -0
- package/dist/src/ds/components/MetricsStackedBarChart/metrics-stacked-bar-chart.d.ts +1 -0
- package/dist/src/ds/components/Table/Table.d.ts +4 -2
- package/dist/style.css +117 -1
- package/dist/{traces-data-list-CHREkLv0.cjs → traces-data-list-BH24OVKh.cjs} +7 -1
- package/dist/traces-data-list-BH24OVKh.cjs.map +1 -0
- package/dist/{traces-data-list-BgloVIVi.js → traces-data-list-BOJB37dV.js} +7 -1
- package/dist/traces-data-list-BOJB37dV.js.map +1 -0
- package/package.json +11 -11
- package/dist/metrics-stacked-bar-chart-BijHfnOd.cjs.map +0 -1
- package/dist/metrics-stacked-bar-chart-CdcENBLD.js.map +0 -1
- package/dist/traces-data-list-BgloVIVi.js.map +0 -1
- 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-
|
|
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-
|
|
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,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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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { M as MetricsStackedBarChart } from '../metrics-stacked-bar-chart-
|
|
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
|
-
|
|
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"
|