@mastra/playground-ui 64.0.0-alpha.8 → 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 (155) hide show
  1. package/dist/combobox-BNlVCFgY.cjs +718 -0
  2. package/dist/combobox-BNlVCFgY.cjs.map +1 -0
  3. package/dist/combobox-Bw13EcK0.js +676 -0
  4. package/dist/combobox-Bw13EcK0.js.map +1 -0
  5. package/dist/{combobox-styles-B3jftCXY.js → combobox-styles-Dr66ofEp.js} +2 -2
  6. package/dist/{combobox-styles-B3jftCXY.js.map → combobox-styles-Dr66ofEp.js.map} +1 -1
  7. package/dist/components/Combobox.cjs.js +22 -1
  8. package/dist/components/Combobox.cjs.js.map +1 -1
  9. package/dist/components/Combobox.es.js +2 -2
  10. package/dist/components/DataList.cjs.js +15 -17
  11. package/dist/components/DataList.cjs.js.map +1 -1
  12. package/dist/components/DataList.es.js +4 -5
  13. package/dist/components/DataList.es.js.map +1 -1
  14. package/dist/components/EnvironmentVariablesEditor.cjs.js +1 -1
  15. package/dist/components/EnvironmentVariablesEditor.es.js +1 -1
  16. package/dist/components/FilterBar.es.js +3 -3
  17. package/dist/components/LogsDataList.cjs.js +5 -2
  18. package/dist/components/LogsDataList.cjs.js.map +1 -1
  19. package/dist/components/LogsDataList.es.js +5 -2
  20. package/dist/components/LogsDataList.es.js.map +1 -1
  21. package/dist/components/Meter.cjs.js +172 -0
  22. package/dist/components/Meter.cjs.js.map +1 -0
  23. package/dist/components/Meter.d.ts +2 -0
  24. package/dist/components/Meter.es.js +167 -0
  25. package/dist/components/Meter.es.js.map +1 -0
  26. package/dist/components/MetricsStackedBarChart.cjs.js +1 -1
  27. package/dist/components/MetricsStackedBarChart.es.js +1 -1
  28. package/dist/components/PropertyFilter.cjs.js +1 -1
  29. package/dist/components/PropertyFilter.es.js +1 -1
  30. package/dist/components/SavedViews.es.js +1 -1
  31. package/dist/components/Table.cjs.js +11 -1
  32. package/dist/components/Table.cjs.js.map +1 -1
  33. package/dist/components/Table.es.js +11 -1
  34. package/dist/components/Table.es.js.map +1 -1
  35. package/dist/{data-list-top-DSr_ocKA.js → data-list-DdCZZctL.js} +332 -5
  36. package/dist/data-list-DdCZZctL.js.map +1 -0
  37. package/dist/{data-list-top-ByT2Mo77.cjs → data-list-ecHsw-zr.cjs} +339 -13
  38. package/dist/data-list-ecHsw-zr.cjs.map +1 -0
  39. package/dist/{data-list-skeleton-B_SXAeE0.js → data-list-skeleton-CGKlcoiI.js} +2 -2
  40. package/dist/{data-list-skeleton-B_SXAeE0.js.map → data-list-skeleton-CGKlcoiI.js.map} +1 -1
  41. package/dist/{data-list-skeleton-BqC9Gggi.cjs → data-list-skeleton-DGMTqeNP.cjs} +6 -6
  42. package/dist/{data-list-skeleton-BqC9Gggi.cjs.map → data-list-skeleton-DGMTqeNP.cjs.map} +1 -1
  43. package/dist/domains/chat/tools/badges/workflow-badge.cjs.js +2 -1
  44. package/dist/domains/chat/tools/badges/workflow-badge.cjs.js.map +1 -1
  45. package/dist/domains/chat/tools/badges/workflow-badge.es.js +2 -1
  46. package/dist/domains/chat/tools/badges/workflow-badge.es.js.map +1 -1
  47. package/dist/domains/logs/components/logs-list-view.cjs.js +3 -2
  48. package/dist/domains/logs/components/logs-list-view.cjs.js.map +1 -1
  49. package/dist/domains/logs/components/logs-list-view.es.js +3 -2
  50. package/dist/domains/logs/components/logs-list-view.es.js.map +1 -1
  51. package/dist/domains/metrics/components/agent-runs-card.cjs.js +1 -1
  52. package/dist/domains/metrics/components/agent-runs-card.es.js +1 -1
  53. package/dist/domains/metrics/components/token-usage-card.cjs.js +1 -1
  54. package/dist/domains/metrics/components/token-usage-card.es.js +1 -1
  55. package/dist/domains/scores/components/span-scoring.cjs.js +1 -1
  56. package/dist/domains/scores/components/span-scoring.es.js +1 -1
  57. package/dist/domains/scores/components/trace-scores-tab.cjs.js +2 -1
  58. package/dist/domains/scores/components/trace-scores-tab.cjs.js.map +1 -1
  59. package/dist/domains/scores/components/trace-scores-tab.es.js +2 -1
  60. package/dist/domains/scores/components/trace-scores-tab.es.js.map +1 -1
  61. package/dist/domains/traces/components/thread-view-by-trace.cjs.js +0 -1
  62. package/dist/domains/traces/components/thread-view-by-trace.cjs.js.map +1 -1
  63. package/dist/domains/traces/components/thread-view-by-trace.es.js +0 -1
  64. package/dist/domains/traces/components/thread-view-by-trace.es.js.map +1 -1
  65. package/dist/domains/traces/components/trace-columns-menu.cjs.js +10 -2
  66. package/dist/domains/traces/components/trace-columns-menu.cjs.js.map +1 -1
  67. package/dist/domains/traces/components/trace-columns-menu.es.js +10 -2
  68. package/dist/domains/traces/components/trace-columns-menu.es.js.map +1 -1
  69. package/dist/domains/traces/components/trace-data-panel.cjs.js +2 -1
  70. package/dist/domains/traces/components/trace-data-panel.cjs.js.map +1 -1
  71. package/dist/domains/traces/components/trace-data-panel.es.js +2 -1
  72. package/dist/domains/traces/components/trace-data-panel.es.js.map +1 -1
  73. package/dist/domains/traces/components/trace-time-range-chip.es.js +1 -1
  74. package/dist/domains/traces/components/traces-list-view-adapter.cjs.js +2 -0
  75. package/dist/domains/traces/components/traces-list-view-adapter.cjs.js.map +1 -1
  76. package/dist/domains/traces/components/traces-list-view-adapter.es.js +2 -0
  77. package/dist/domains/traces/components/traces-list-view-adapter.es.js.map +1 -1
  78. package/dist/domains/traces/components/traces-list-view.cjs.js +13 -5
  79. package/dist/domains/traces/components/traces-list-view.cjs.js.map +1 -1
  80. package/dist/domains/traces/components/traces-list-view.es.js +12 -4
  81. package/dist/domains/traces/components/traces-list-view.es.js.map +1 -1
  82. package/dist/domains/traces/components/traces-page-skeleton.cjs.js +4 -1
  83. package/dist/domains/traces/components/traces-page-skeleton.cjs.js.map +1 -1
  84. package/dist/domains/traces/components/traces-page-skeleton.es.js +4 -1
  85. package/dist/domains/traces/components/traces-page-skeleton.es.js.map +1 -1
  86. package/dist/domains/traces/trace-list-columns.cjs.js +12 -4
  87. package/dist/domains/traces/trace-list-columns.cjs.js.map +1 -1
  88. package/dist/domains/traces/trace-list-columns.es.js +12 -4
  89. package/dist/domains/traces/trace-list-columns.es.js.map +1 -1
  90. package/dist/domains/workflows/components/workflow-combobox.cjs.js +1 -1
  91. package/dist/domains/workflows/components/workflow-combobox.es.js +1 -1
  92. package/dist/domains/workflows/components/workflows-list/workflows-list.cjs.js +2 -2
  93. package/dist/domains/workflows/components/workflows-list/workflows-list.es.js +2 -2
  94. package/dist/ee/signals/components/entity-index-list.cjs.js +3 -1
  95. package/dist/ee/signals/components/entity-index-list.cjs.js.map +1 -1
  96. package/dist/ee/signals/components/entity-index-list.es.js +3 -1
  97. package/dist/ee/signals/components/entity-index-list.es.js.map +1 -1
  98. package/dist/ee/signals/components/trace-intelligence-entity-index.cjs.js +3 -1
  99. package/dist/ee/signals/components/trace-intelligence-entity-index.cjs.js.map +1 -1
  100. package/dist/ee/signals/components/trace-intelligence-entity-index.es.js +3 -1
  101. package/dist/ee/signals/components/trace-intelligence-entity-index.es.js.map +1 -1
  102. package/dist/ee/topics/components/topic-trace-summary-list.cjs.js +1 -1
  103. package/dist/ee/topics/components/topic-trace-summary-list.es.js +1 -1
  104. package/dist/{filter-bar-chip-BAqmNIeE.js → filter-bar-chip-BarAq1S2.js} +2 -2
  105. package/dist/{filter-bar-chip-BAqmNIeE.js.map → filter-bar-chip-BarAq1S2.js.map} +1 -1
  106. package/dist/layout/tabbed-container.cjs.js +2 -2
  107. package/dist/layout/tabbed-container.es.js +2 -2
  108. package/dist/{logs-data-list-CoER2Hst.js → logs-data-list-DBJINzIL.js} +2 -3
  109. package/dist/{logs-data-list-CoER2Hst.js.map → logs-data-list-DBJINzIL.js.map} +1 -1
  110. package/dist/{logs-data-list-DRR6cMgl.cjs → logs-data-list-IWZgMCKG.cjs} +21 -22
  111. package/dist/{logs-data-list-DRR6cMgl.cjs.map → logs-data-list-IWZgMCKG.cjs.map} +1 -1
  112. package/dist/{metrics-stacked-bar-chart-BijHfnOd.cjs → metrics-stacked-bar-chart-BofJ8NDc.cjs} +45 -3
  113. package/dist/metrics-stacked-bar-chart-BofJ8NDc.cjs.map +1 -0
  114. package/dist/{metrics-stacked-bar-chart-CdcENBLD.js → metrics-stacked-bar-chart-DcxHznKw.js} +47 -5
  115. package/dist/metrics-stacked-bar-chart-DcxHznKw.js.map +1 -0
  116. package/dist/src/domains/traces/components/traces-list-view.d.ts +4 -0
  117. package/dist/src/domains/traces/trace-list-columns.d.ts +1 -1
  118. package/dist/src/ds/components/Combobox/combobox-parts.d.ts +102 -0
  119. package/dist/src/ds/components/Combobox/combobox.d.ts +17 -3
  120. package/dist/src/ds/components/Combobox/index.d.ts +1 -0
  121. package/dist/src/ds/components/DataList/TracesDataList/traces-data-list-cells.d.ts +7 -0
  122. package/dist/src/ds/components/DataList/TracesDataList/traces-data-list.d.ts +2 -1
  123. package/dist/src/ds/components/Meter/index.d.ts +2 -0
  124. package/dist/src/ds/components/Meter/meter-context.d.ts +6 -0
  125. package/dist/src/ds/components/Meter/meter-key-row.d.ts +6 -0
  126. package/dist/src/ds/components/Meter/meter-root.d.ts +14 -0
  127. package/dist/src/ds/components/Meter/meter-segment.d.ts +5 -0
  128. package/dist/src/ds/components/Meter/meter-source.d.ts +6 -0
  129. package/dist/src/ds/components/Meter/meter.d.ts +6 -0
  130. package/dist/src/ds/components/MetricsStackedBarChart/metrics-stacked-bar-chart.d.ts +1 -0
  131. package/dist/src/ds/components/Table/Table.d.ts +4 -2
  132. package/dist/style.css +196 -2
  133. package/dist/{traces-data-list-B0-fbEpk.cjs → traces-data-list-BH24OVKh.cjs} +23 -19
  134. package/dist/traces-data-list-BH24OVKh.cjs.map +1 -0
  135. package/dist/{traces-data-list-0GcqZUbe.js → traces-data-list-BOJB37dV.js} +8 -4
  136. package/dist/traces-data-list-BOJB37dV.js.map +1 -0
  137. package/package.json +10 -10
  138. package/dist/combobox-DlKD-Q3M.js +0 -208
  139. package/dist/combobox-DlKD-Q3M.js.map +0 -1
  140. package/dist/combobox-VHtZQcl9.cjs +0 -229
  141. package/dist/combobox-VHtZQcl9.cjs.map +0 -1
  142. package/dist/data-list-DUfXIhyC.cjs +0 -142
  143. package/dist/data-list-DUfXIhyC.cjs.map +0 -1
  144. package/dist/data-list-DXQY_iQW.js +0 -138
  145. package/dist/data-list-DXQY_iQW.js.map +0 -1
  146. package/dist/data-list-spacer-ByA4ce2a.js +0 -209
  147. package/dist/data-list-spacer-ByA4ce2a.js.map +0 -1
  148. package/dist/data-list-spacer-tQaBaum4.cjs +0 -218
  149. package/dist/data-list-spacer-tQaBaum4.cjs.map +0 -1
  150. package/dist/data-list-top-ByT2Mo77.cjs.map +0 -1
  151. package/dist/data-list-top-DSr_ocKA.js.map +0 -1
  152. package/dist/metrics-stacked-bar-chart-BijHfnOd.cjs.map +0 -1
  153. package/dist/metrics-stacked-bar-chart-CdcENBLD.js.map +0 -1
  154. package/dist/traces-data-list-0GcqZUbe.js.map +0 -1
  155. package/dist/traces-data-list-B0-fbEpk.cjs.map +0 -1
@@ -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
@@ -7,7 +7,7 @@ const jsxRuntime = require('react/jsx-runtime');
7
7
  const lucideReact = require('lucide-react');
8
8
  const React = require('react');
9
9
  const Button = require('../Button-DH1aTzbs.cjs');
10
- const combobox = require('../combobox-VHtZQcl9.cjs');
10
+ const combobox = require('../combobox-BNlVCFgY.cjs');
11
11
  const field = require('../field-BCU5ZtWV.cjs');
12
12
  require('../field-control-aria-WzMGs0A4.cjs');
13
13
  const popover = require('../popover-AfnrAYck.cjs');
@@ -4,7 +4,7 @@ import { jsxs, jsx } from 'react/jsx-runtime';
4
4
  import { ListFilterPlusIcon, ArrowLeftIcon, FilterIcon, PlusIcon, X, ListFilterPlus, ChevronRightIcon } from 'lucide-react';
5
5
  import { useMemo, useState, useRef, useCallback, useEffect, forwardRef } from 'react';
6
6
  import { B as Button } from '../Button-EGoajBQY.js';
7
- import { C as Combobox } from '../combobox-DlKD-Q3M.js';
7
+ import { C as Combobox } from '../combobox-Bw13EcK0.js';
8
8
  import { F as Field, c as FieldError } from '../field-Dl1zeXTv.js';
9
9
  import '../field-control-aria-DB6y41tQ.js';
10
10
  import { P as Popover, b as PopoverTrigger, a as PopoverContent } from '../popover-BqRniR9J.js';
@@ -3,7 +3,7 @@ import { LayersPlusIcon, ChevronDownIcon, LayersIcon, PencilIcon, TextCursorInpu
3
3
  import { useState, Fragment, useSyncExternalStore } from 'react';
4
4
  import { z } from 'zod/v4';
5
5
  import { passwordManagerOptOutProps } from '../primitives/password-manager-autofill.es.js';
6
- import { a as FilterBarFieldLabel, t as formatValue } from '../filter-bar-chip-BAqmNIeE.js';
6
+ import { a as FilterBarFieldLabel, t as formatValue } from '../filter-bar-chip-BarAq1S2.js';
7
7
  import { T as Txt } from '../Txt-BtIGLRk1.js';
8
8
  import { B as Button, b as buttonVariants } from '../Button-EGoajBQY.js';
9
9
  import { C as ContextMenu } from '../context-menu-C67xhcfa.js';
@@ -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"