@mastra/playground-ui 51.1.0 → 51.2.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +89 -0
- package/dist/Composer.css +1 -4
- package/dist/components/Comment.cjs.js +170 -0
- package/dist/components/Comment.cjs.js.map +1 -0
- package/dist/components/Comment.d.ts +2 -0
- package/dist/components/Comment.es.js +156 -0
- package/dist/components/Comment.es.js.map +1 -0
- package/dist/components/Composer.cjs.js +1 -1
- package/dist/components/Composer.cjs.js.map +1 -1
- package/dist/components/Composer.es.js +1 -1
- package/dist/components/Composer.es.js.map +1 -1
- package/dist/components/DataList.cjs.js +9 -9
- package/dist/components/DataList.cjs.js.map +1 -1
- package/dist/components/DataList.es.js +9 -9
- package/dist/components/DataList.es.js.map +1 -1
- package/dist/components/DateTimePicker.cjs.js +1 -1
- package/dist/components/DateTimePicker.es.js +1 -1
- package/dist/components/EnvironmentVariablesEditor.cjs.js +6 -6
- package/dist/components/EnvironmentVariablesEditor.cjs.js.map +1 -1
- package/dist/components/EnvironmentVariablesEditor.es.js +6 -6
- package/dist/components/EnvironmentVariablesEditor.es.js.map +1 -1
- package/dist/components/FormFieldBlocks.cjs.js +1 -1
- package/dist/components/FormFieldBlocks.es.js +1 -1
- package/dist/components/JSONSchemaForm.cjs.js +1 -1
- package/dist/components/JSONSchemaForm.es.js +1 -1
- package/dist/components/LogsDataList.cjs.js +2 -3
- package/dist/components/LogsDataList.cjs.js.map +1 -1
- package/dist/components/LogsDataList.es.js +2 -3
- package/dist/components/LogsDataList.es.js.map +1 -1
- package/dist/components/MainSidebar.cjs.js +1 -1
- package/dist/components/MainSidebar.cjs.js.map +1 -1
- package/dist/components/MainSidebar.es.js +1 -1
- package/dist/components/MainSidebar.es.js.map +1 -1
- package/dist/components/SettingsRow.cjs.js +35 -14
- package/dist/components/SettingsRow.cjs.js.map +1 -1
- package/dist/components/SettingsRow.es.js +35 -14
- package/dist/components/SettingsRow.es.js.map +1 -1
- package/dist/components/ai/tool-call.cjs.js +1 -1
- package/dist/components/ai/tool-call.cjs.js.map +1 -1
- package/dist/components/ai/tool-call.es.js +1 -1
- package/dist/components/ai/tool-call.es.js.map +1 -1
- package/dist/{data-list-CfsEAR2E.js → data-list-BOI8fRuk.js} +7 -9
- package/dist/data-list-BOI8fRuk.js.map +1 -0
- package/dist/{data-list-BK_lJxMN.cjs → data-list-CCacNODd.cjs} +7 -9
- package/dist/data-list-CCacNODd.cjs.map +1 -0
- package/dist/{data-list-skeleton-dVbplSiW.cjs → data-list-skeleton-BHBSIQHN.cjs} +8 -4
- package/dist/data-list-skeleton-BHBSIQHN.cjs.map +1 -0
- package/dist/{data-list-skeleton-DQp3KwVO.js → data-list-skeleton-DDO_OE14.js} +8 -4
- package/dist/data-list-skeleton-DDO_OE14.js.map +1 -0
- package/dist/{data-list-top-cell-DyBSefIr.cjs → data-list-top-cell-BOXO5s7I.cjs} +55 -104
- package/dist/data-list-top-cell-BOXO5s7I.cjs.map +1 -0
- package/dist/{data-list-top-cell-DZiX9cTb.js → data-list-top-cell-CC5jjv5s.js} +54 -104
- package/dist/data-list-top-cell-CC5jjv5s.js.map +1 -0
- package/dist/domains/logs/components/logs-list-view.cjs.js +2 -2
- package/dist/domains/logs/components/logs-list-view.es.js +2 -2
- package/dist/domains/metrics/components/memory-card-view.cjs.js +3 -3
- package/dist/domains/metrics/components/memory-card-view.cjs.js.map +1 -1
- package/dist/domains/metrics/components/memory-card-view.es.js +3 -3
- package/dist/domains/metrics/components/memory-card-view.es.js.map +1 -1
- package/dist/domains/metrics/components/model-usage-cost-card-view.cjs.js +2 -2
- package/dist/domains/metrics/components/model-usage-cost-card-view.cjs.js.map +1 -1
- package/dist/domains/metrics/components/model-usage-cost-card-view.es.js +2 -2
- package/dist/domains/metrics/components/model-usage-cost-card-view.es.js.map +1 -1
- package/dist/domains/metrics/components/scores-card-view.cjs.js +2 -2
- package/dist/domains/metrics/components/scores-card-view.cjs.js.map +1 -1
- package/dist/domains/metrics/components/scores-card-view.es.js +2 -2
- package/dist/domains/metrics/components/scores-card-view.es.js.map +1 -1
- package/dist/domains/traces/components/span-data-panel-view.cjs.js +1 -1
- package/dist/domains/traces/components/span-data-panel-view.cjs.js.map +1 -1
- package/dist/domains/traces/components/span-data-panel-view.es.js +1 -1
- package/dist/domains/traces/components/span-data-panel-view.es.js.map +1 -1
- package/dist/domains/traces/components/trace-data-panel-view.cjs.js +16 -5
- package/dist/domains/traces/components/trace-data-panel-view.cjs.js.map +1 -1
- package/dist/domains/traces/components/trace-data-panel-view.es.js +16 -5
- package/dist/domains/traces/components/trace-data-panel-view.es.js.map +1 -1
- package/dist/domains/traces/components/traces-list-view.cjs.js +4 -4
- package/dist/domains/traces/components/traces-list-view.cjs.js.map +1 -1
- package/dist/domains/traces/components/traces-list-view.es.js +4 -4
- package/dist/domains/traces/components/traces-list-view.es.js.map +1 -1
- package/dist/ee/topics/components/topic-trace-summary-list.cjs.js +1 -1
- package/dist/ee/topics/components/topic-trace-summary-list.es.js +1 -1
- package/dist/{logs-data-list-COfm0LbS.js → logs-data-list-DRXJ89IZ.js} +7 -7
- package/dist/logs-data-list-DRXJ89IZ.js.map +1 -0
- package/dist/{logs-data-list-CEPdgKxp.cjs → logs-data-list-Xayqbjw4.cjs} +7 -7
- package/dist/logs-data-list-Xayqbjw4.cjs.map +1 -0
- package/dist/metrics-kpi-card-AhIw9eyu.js.map +1 -1
- package/dist/metrics-kpi-card-tAReOFYk.cjs.map +1 -1
- package/dist/src/domains/traces/components/trace-data-panel-view.d.ts +11 -2
- package/dist/src/ds/components/Comment/comment-composer.d.ts +12 -0
- package/dist/src/ds/components/Comment/comment-context.d.ts +3 -0
- package/dist/src/ds/components/Comment/comment.d.ts +21 -0
- package/dist/src/ds/components/Comment/comment.stories.d.ts +10 -0
- package/dist/src/ds/components/Comment/index.d.ts +5 -0
- package/dist/src/ds/components/DataList/data-list-cells.d.ts +16 -18
- package/dist/src/ds/components/DataList/data-list-root.d.ts +6 -7
- package/dist/src/ds/components/DataList/data-list-row-link.d.ts +1 -1
- package/dist/src/ds/components/DataList/data-list-row-wrapper.d.ts +2 -2
- package/dist/src/ds/components/DataList/data-list.d.ts +2 -2
- package/dist/src/ds/components/DataList/data-list.stories.d.ts +1 -1
- package/dist/src/ds/components/DataList/shared.d.ts +18 -18
- package/dist/src/ds/components/MetricsKpiCard/metrics-kpi-card-value.d.ts +2 -1
- package/dist/src/ds/components/SettingsRow/settings-row.d.ts +8 -3
- package/dist/src/ds/components/SettingsRow/settings-row.stories.d.ts +1 -0
- package/dist/style.css +67 -232
- package/dist/{text-field-block-BGlwSFYC.cjs → text-field-block-B4CvIwKh.cjs} +2 -1
- package/dist/text-field-block-B4CvIwKh.cjs.map +1 -0
- package/dist/{text-field-block-DOiM0dpY.js → text-field-block-Ddl2tJ6D.js} +2 -1
- package/dist/{text-field-block-DOiM0dpY.js.map → text-field-block-Ddl2tJ6D.js.map} +1 -1
- package/dist/{traces-data-list-CyaLRi1n.cjs → traces-data-list-BLZgf-Es.cjs} +7 -7
- package/dist/traces-data-list-BLZgf-Es.cjs.map +1 -0
- package/dist/{traces-data-list-BURMAmFH.js → traces-data-list-DmXGwe4Q.js} +7 -7
- package/dist/traces-data-list-DmXGwe4Q.js.map +1 -0
- package/package.json +7 -7
- package/theme.css +7 -0
- package/dist/data-list-BK_lJxMN.cjs.map +0 -1
- package/dist/data-list-CfsEAR2E.js.map +0 -1
- package/dist/data-list-skeleton-DQp3KwVO.js.map +0 -1
- package/dist/data-list-skeleton-dVbplSiW.cjs.map +0 -1
- package/dist/data-list-top-cell-DZiX9cTb.js.map +0 -1
- package/dist/data-list-top-cell-DyBSefIr.cjs.map +0 -1
- package/dist/logs-data-list-CEPdgKxp.cjs.map +0 -1
- package/dist/logs-data-list-COfm0LbS.js.map +0 -1
- package/dist/text-field-block-BGlwSFYC.cjs.map +0 -1
- package/dist/traces-data-list-BURMAmFH.js.map +0 -1
- package/dist/traces-data-list-CyaLRi1n.cjs.map +0 -1
|
@@ -8,18 +8,18 @@ import { S as ScrollArea } from './scroll-area-DZrEuKjC.js';
|
|
|
8
8
|
import { T as Tooltip, c as TooltipTrigger, a as TooltipContent } from './tooltip-CF30mRAe.js';
|
|
9
9
|
|
|
10
10
|
const dataListRowOuterStyles = [
|
|
11
|
-
"data-list-row col-span-full relative
|
|
12
|
-
'after:absolute after:inset-x-[-0.25rem] after:bottom-[-0.25rem] after:h-px after:bg-border1 after:content-[""] after:pointer-events-none',
|
|
13
|
-
"[&:has(+.data-list-subheader)]:after:hidden [&:not(:has(~.data-list-row))]:after:hidden",
|
|
11
|
+
"group/data-list-row data-list-row col-span-full relative min-h-9",
|
|
14
12
|
"transition-colors duration-200 rounded-lg"
|
|
15
13
|
];
|
|
16
14
|
const dataListRowInteractiveStyles = [
|
|
17
15
|
"grid grid-cols-subgrid gap-8 px-5 outline-none cursor-pointer",
|
|
18
|
-
"
|
|
16
|
+
"focus-visible:ring-1 focus-visible:ring-inset focus-visible:ring-accent1",
|
|
19
17
|
"transition-colors duration-200 rounded-lg"
|
|
20
18
|
];
|
|
21
|
-
const dataListRowStyles = [
|
|
22
|
-
const dataListRowStaticStyles = ["
|
|
19
|
+
const dataListRowStyles = [...dataListRowInteractiveStyles, ...dataListRowOuterStyles];
|
|
20
|
+
const dataListRowStaticStyles = ["grid grid-cols-subgrid gap-8 px-5", ...dataListRowOuterStyles];
|
|
21
|
+
const dataListRowRevealStyles = "opacity-0 pointer-coarse:opacity-100 group-focus-within/data-list-row:opacity-100 group-hover/data-list-row:opacity-100";
|
|
22
|
+
const dataListTopRevealStyles = "opacity-0 pointer-coarse:opacity-100 group-focus-within/data-list-top:opacity-100 group-hover/data-list-top:opacity-100";
|
|
23
23
|
const dataListStickyStartStyles = [
|
|
24
24
|
"data-list-sticky-start sticky left-0 z-10 isolate self-stretch overflow-visible",
|
|
25
25
|
'after:absolute after:-right-4 after:top-1/2 after:-translate-y-1/2 after:h-4 after:w-px after:bg-border2 after:content-[""] after:pointer-events-none'
|
|
@@ -36,14 +36,13 @@ const dataListRowVariants = cva("", {
|
|
|
36
36
|
}
|
|
37
37
|
});
|
|
38
38
|
|
|
39
|
-
function DataListCell({ children, className,
|
|
39
|
+
function DataListCell({ children, className, as, sticky, ...rest }) {
|
|
40
40
|
const Component = as || "span";
|
|
41
41
|
return /* @__PURE__ */ jsx(
|
|
42
42
|
Component,
|
|
43
43
|
{
|
|
44
44
|
className: cn(
|
|
45
45
|
'relative grid max-w-full min-w-0 items-center overflow-hidden text-ui-md whitespace-nowrap text-neutral3 empty:before:text-neutral2 empty:before:content-["—"]',
|
|
46
|
-
height === "compact" ? "py-1.5" : "py-2.5",
|
|
47
46
|
sticky === "start" && dataListStickyStartStyles,
|
|
48
47
|
className
|
|
49
48
|
),
|
|
@@ -52,6 +51,18 @@ function DataListCell({ children, className, height = "default", as, sticky, ...
|
|
|
52
51
|
}
|
|
53
52
|
);
|
|
54
53
|
}
|
|
54
|
+
function DataListActionsCell({ children, className, ...rest }) {
|
|
55
|
+
return /* @__PURE__ */ jsx(DataListCell, { className, ...rest, children: /* @__PURE__ */ jsx(
|
|
56
|
+
"span",
|
|
57
|
+
{
|
|
58
|
+
className: cn(
|
|
59
|
+
"flex w-full items-center justify-end gap-1 pr-3 transition-opacity duration-200",
|
|
60
|
+
dataListRowRevealStyles
|
|
61
|
+
),
|
|
62
|
+
children
|
|
63
|
+
}
|
|
64
|
+
) });
|
|
65
|
+
}
|
|
55
66
|
const dataListTruncateContentStyles = 'block min-w-0 max-w-full truncate empty:before:content-["—"] empty:before:text-neutral2 [&>*]:min-w-0 [&>*]:max-w-full [&>*]:overflow-hidden [&>*]:text-ellipsis [&>*]:whitespace-nowrap';
|
|
56
67
|
const dataListInlineTextTruncateStyles = "min-w-0 flex-1 truncate";
|
|
57
68
|
function DataListInlineText({ children }) {
|
|
@@ -76,11 +87,11 @@ function DataListTruncatedCellContent({ children }) {
|
|
|
76
87
|
});
|
|
77
88
|
});
|
|
78
89
|
}
|
|
79
|
-
function DataListTextCell({ children, className, ...rest }) {
|
|
80
|
-
return /* @__PURE__ */ jsx(DataListCell, { className, ...rest, children: /* @__PURE__ */ jsx("span", { className: dataListTruncateContentStyles, children: /* @__PURE__ */ jsx(DataListTruncatedCellContent, { children }) }) });
|
|
90
|
+
function DataListTextCell({ children, className, font = "sans", ...rest }) {
|
|
91
|
+
return /* @__PURE__ */ jsx(DataListCell, { className: cn(font === "mono" && "font-mono text-ui-smd", className), ...rest, children: /* @__PURE__ */ jsx("span", { className: dataListTruncateContentStyles, children: /* @__PURE__ */ jsx(DataListTruncatedCellContent, { children }) }) });
|
|
81
92
|
}
|
|
82
93
|
function DataListNameCell({ children, className }) {
|
|
83
|
-
return /* @__PURE__ */ jsx(DataListCell, { className: cn("text-left text-neutral4", className), children: /* @__PURE__ */ jsx("span", { className: dataListTruncateContentStyles, children: /* @__PURE__ */ jsx(DataListTruncatedCellContent, { children }) }) });
|
|
94
|
+
return /* @__PURE__ */ jsx(DataListCell, { className: cn("text-left font-medium text-neutral4", className), children: /* @__PURE__ */ jsx("span", { className: dataListTruncateContentStyles, children: /* @__PURE__ */ jsx(DataListTruncatedCellContent, { children }) }) });
|
|
84
95
|
}
|
|
85
96
|
function DataListDescriptionCell({ children, className }) {
|
|
86
97
|
return /* @__PURE__ */ jsx(DataListCell, { className: cn("text-neutral2", className), children: /* @__PURE__ */ jsx("span", { className: dataListTruncateContentStyles, children: /* @__PURE__ */ jsx(DataListTruncatedCellContent, { children }) }) });
|
|
@@ -91,7 +102,7 @@ function DataListRowHeaderCell({ children, className, ...rest }) {
|
|
|
91
102
|
{
|
|
92
103
|
sticky: "start",
|
|
93
104
|
className: cn(
|
|
94
|
-
"data-list-row-header -mr-4 -ml-5 w-auto max-w-none rounded-l-
|
|
105
|
+
"data-list-row-header -mr-4 -ml-5 w-auto max-w-none rounded-l-lg pr-4 pl-5 text-left text-ui-sm font-medium text-neutral2",
|
|
95
106
|
className
|
|
96
107
|
),
|
|
97
108
|
...rest,
|
|
@@ -99,17 +110,10 @@ function DataListRowHeaderCell({ children, className, ...rest }) {
|
|
|
99
110
|
}
|
|
100
111
|
);
|
|
101
112
|
}
|
|
102
|
-
function DataListNumberCell({
|
|
103
|
-
children,
|
|
104
|
-
className,
|
|
105
|
-
highlight,
|
|
106
|
-
height = "compact",
|
|
107
|
-
...rest
|
|
108
|
-
}) {
|
|
113
|
+
function DataListNumberCell({ children, className, highlight, ...rest }) {
|
|
109
114
|
return /* @__PURE__ */ jsx(
|
|
110
115
|
DataListCell,
|
|
111
116
|
{
|
|
112
|
-
height,
|
|
113
117
|
className: cn(
|
|
114
118
|
"justify-items-end text-right text-ui-sm tabular-nums",
|
|
115
119
|
highlight ? "font-semibold text-neutral4" : "text-neutral3",
|
|
@@ -124,16 +128,16 @@ function getShortId(id) {
|
|
|
124
128
|
return id?.slice(0, 8) ?? "";
|
|
125
129
|
}
|
|
126
130
|
function DataListIdCell({ id }) {
|
|
127
|
-
return /* @__PURE__ */ jsx(DataListCell, {
|
|
131
|
+
return /* @__PURE__ */ jsx(DataListCell, { className: "text-ui-smd text-neutral3 tracking-wide", children: getShortId(id) });
|
|
128
132
|
}
|
|
129
133
|
function DataListSelectCell({ checked, onToggle, disabled, ...rest }) {
|
|
130
134
|
return /* @__PURE__ */ jsx(
|
|
131
135
|
DataListCell,
|
|
132
136
|
{
|
|
133
137
|
as: "label",
|
|
134
|
-
height: "compact",
|
|
135
138
|
className: cn(
|
|
136
|
-
"size-8 justify-items-center self-center overflow-visible px-0
|
|
139
|
+
"size-8 justify-items-center self-center overflow-visible px-0",
|
|
140
|
+
!checked && dataListRowRevealStyles,
|
|
137
141
|
disabled ? "cursor-not-allowed" : "cursor-pointer"
|
|
138
142
|
),
|
|
139
143
|
onClick: (e) => e.stopPropagation(),
|
|
@@ -151,29 +155,17 @@ function DataListSelectCell({ checked, onToggle, disabled, ...rest }) {
|
|
|
151
155
|
}
|
|
152
156
|
);
|
|
153
157
|
}
|
|
154
|
-
function DataListMonoCell({ children, className, height = "compact" }) {
|
|
155
|
-
return /* @__PURE__ */ jsx(DataListCell, { height, children: /* @__PURE__ */ jsx(
|
|
156
|
-
"span",
|
|
157
|
-
{
|
|
158
|
-
className: cn(
|
|
159
|
-
'block max-w-full min-w-0 truncate font-mono text-ui-smd text-neutral3 empty:before:content-["—"]',
|
|
160
|
-
className
|
|
161
|
-
),
|
|
162
|
-
children
|
|
163
|
-
}
|
|
164
|
-
) });
|
|
165
|
-
}
|
|
166
158
|
function toDate(value) {
|
|
167
159
|
const date = value instanceof Date ? value : new Date(value);
|
|
168
160
|
return isNaN(date.getTime()) ? null : date;
|
|
169
161
|
}
|
|
170
162
|
function DataListDateCell({ timestamp }) {
|
|
171
163
|
const date = toDate(timestamp);
|
|
172
|
-
return /* @__PURE__ */ jsx(DataListCell, {
|
|
164
|
+
return /* @__PURE__ */ jsx(DataListCell, { className: "text-ui-smd text-neutral2", children: date ? isToday(date) ? "Today" : format(date, "MMM dd") : null });
|
|
173
165
|
}
|
|
174
166
|
function DataListTimeCell({ timestamp }) {
|
|
175
167
|
const date = toDate(timestamp);
|
|
176
|
-
return /* @__PURE__ */ jsx(DataListCell, {
|
|
168
|
+
return /* @__PURE__ */ jsx(DataListCell, { className: "text-ui-smd text-neutral3 flex tabular-nums", children: date ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
177
169
|
format(date, "h:mm:ss"),
|
|
178
170
|
/* @__PURE__ */ jsxs("span", { className: "text-neutral2", children: [
|
|
179
171
|
".",
|
|
@@ -223,8 +215,8 @@ function DataListNoMatch({
|
|
|
223
215
|
|
|
224
216
|
const stickyHeaderBackgroundValues = {
|
|
225
217
|
tinted: {
|
|
226
|
-
background: "
|
|
227
|
-
hoverBackground: "
|
|
218
|
+
background: "var(--surface-header)",
|
|
219
|
+
hoverBackground: "var(--surface-header-hover)"
|
|
228
220
|
},
|
|
229
221
|
surface: {
|
|
230
222
|
background: "var(--surface2)",
|
|
@@ -244,55 +236,36 @@ const borderlessTableStyles = [
|
|
|
244
236
|
"gap-y-px",
|
|
245
237
|
// A shared opaque tint gives both column headers and sticky row headers the
|
|
246
238
|
// same treatment without revealing scrolled content beneath sticky surfaces.
|
|
247
|
-
"[&_.data-list-top]:
|
|
248
|
-
"[&_.data-list-
|
|
249
|
-
// header column separators: a short, faint vertical line centered in the gap
|
|
250
|
-
// to the left of every header cell but the first. A `before` pseudo (not a
|
|
251
|
-
// `border-l` + padding) keeps header text aligned with the row cells below.
|
|
252
|
-
// The cell's default `overflow-hidden` would clip a gap-positioned pseudo, so
|
|
253
|
-
// these cells switch to `overflow-visible`; the title text still truncates via
|
|
254
|
-
// its inner `truncate` span, so nothing else spills.
|
|
255
|
-
"[&_.data-list-top>*:not(:first-child)]:relative [&_.data-list-top>*:not(:first-child)]:overflow-visible",
|
|
256
|
-
'[&_.data-list-top>*:not(:first-child)]:before:absolute [&_.data-list-top>*:not(:first-child)]:before:-left-4 [&_.data-list-top>*:not(:first-child)]:before:top-1/2 [&_.data-list-top>*:not(:first-child)]:before:-translate-y-1/2 [&_.data-list-top>*:not(:first-child)]:before:h-4 [&_.data-list-top>*:not(:first-child)]:before:w-px [&_.data-list-top>*:not(:first-child)]:before:bg-border2 [&_.data-list-top>*:not(:first-child)]:before:content-[""]',
|
|
257
|
-
"[&_.data-list-row]:mx-0 [&_.data-list-row]:my-0 [&_.data-list-row]:rounded-md",
|
|
239
|
+
"[&_.data-list-top]:bg-[var(--data-list-sticky-header-background)] [&_.data-list-top]:rounded-lg",
|
|
240
|
+
"[&_.data-list-row]:rounded-lg",
|
|
258
241
|
"[&_.data-list-row]:hover:bg-surface-overlay-strong!",
|
|
259
|
-
"[&_.data-list-row
|
|
242
|
+
"[&_.data-list-row:focus-within]:bg-surface-overlay-strong!",
|
|
260
243
|
"[&_.data-list-row>.data-list-sticky-start]:bg-[var(--data-list-sticky-header-background)]",
|
|
261
244
|
"[&_.data-list-row>.data-list-sticky-start]:after:right-0",
|
|
262
245
|
"[&_.data-list-row:hover>.data-list-sticky-start]:bg-[var(--data-list-sticky-header-hover-background)]",
|
|
263
|
-
"[&_.data-list-row:focus-visible>.data-list-sticky-start]:bg-[var(--data-list-sticky-header-hover-background)]",
|
|
264
246
|
"[&_.data-list-row:focus-within>.data-list-sticky-start]:bg-[var(--data-list-sticky-header-hover-background)]",
|
|
265
|
-
"[&_.data-list-top>.data-list-sticky-start]:after:right-0"
|
|
266
|
-
"[&_.data-list-top>.data-list-sticky-start+*]:before:hidden"
|
|
247
|
+
"[&_.data-list-top>.data-list-sticky-start]:after:right-0"
|
|
267
248
|
];
|
|
268
249
|
const dataListFitClasses = {
|
|
269
250
|
content: "w-max max-w-none min-w-full",
|
|
270
251
|
container: "w-full max-w-full"
|
|
271
252
|
};
|
|
272
|
-
const dataListRootVariants = cva(cn("grid content-start"), {
|
|
253
|
+
const dataListRootVariants = cva(cn("grid content-start", ...borderlessTableStyles), {
|
|
273
254
|
variants: {
|
|
274
255
|
variant: {
|
|
275
|
-
striped:
|
|
276
|
-
|
|
277
|
-
"[&_.data-list-row]:after:hidden",
|
|
278
|
-
"[&_.data-list-row]:even:bg-surface-overlay-soft"
|
|
279
|
-
),
|
|
280
|
-
lined: cn(
|
|
281
|
-
...borderlessTableStyles,
|
|
282
|
-
'[&_.data-list-row]:after:pointer-events-none [&_.data-list-row]:after:absolute [&_.data-list-row]:after:h-px [&_.data-list-row]:after:content-[""]',
|
|
283
|
-
"[&_.data-list-row]:after:inset-x-2 [&_.data-list-row]:after:-bottom-px [&_.data-list-row]:after:bg-neutral6/10"
|
|
284
|
-
)
|
|
256
|
+
striped: "[&_.data-list-row]:even:bg-surface-overlay-soft",
|
|
257
|
+
plain: ""
|
|
285
258
|
}
|
|
286
259
|
},
|
|
287
260
|
defaultVariants: {
|
|
288
|
-
variant: "
|
|
261
|
+
variant: "plain"
|
|
289
262
|
}
|
|
290
263
|
});
|
|
291
264
|
function DataListRoot({
|
|
292
265
|
children,
|
|
293
266
|
columns,
|
|
294
267
|
className,
|
|
295
|
-
variant = "
|
|
268
|
+
variant = "plain",
|
|
296
269
|
fit = "content",
|
|
297
270
|
stickyHeaderBackground = "tinted",
|
|
298
271
|
mask,
|
|
@@ -321,7 +294,7 @@ function DataListRoot({
|
|
|
321
294
|
mask: getDataListMask(mask),
|
|
322
295
|
viewportRef: scrollRef,
|
|
323
296
|
viewPortClassName: "max-h-[inherit]",
|
|
324
|
-
className: cn("size-full
|
|
297
|
+
className: cn("size-full", className),
|
|
325
298
|
children: grid
|
|
326
299
|
}
|
|
327
300
|
);
|
|
@@ -333,19 +306,7 @@ function useDataListRowWrapperContext() {
|
|
|
333
306
|
}
|
|
334
307
|
|
|
335
308
|
const DataListRowButton = forwardRef(
|
|
336
|
-
({
|
|
337
|
-
children,
|
|
338
|
-
className,
|
|
339
|
-
type = "button",
|
|
340
|
-
flushLeft,
|
|
341
|
-
flushRight,
|
|
342
|
-
colStart,
|
|
343
|
-
colEnd,
|
|
344
|
-
featured,
|
|
345
|
-
variant,
|
|
346
|
-
style,
|
|
347
|
-
...rest
|
|
348
|
-
}, ref) => {
|
|
309
|
+
({ children, className, type = "button", colStart, colEnd, featured, variant, style, ...rest }, ref) => {
|
|
349
310
|
const isWrapped = useDataListRowWrapperContext();
|
|
350
311
|
const hasColumnOverride = colStart !== void 0 || colEnd !== void 0;
|
|
351
312
|
const resolvedStyle = hasColumnOverride ? { ...style, gridColumn: `${colStart ?? 1} / ${colEnd ?? -1}` } : style;
|
|
@@ -357,11 +318,9 @@ const DataListRowButton = forwardRef(
|
|
|
357
318
|
className: cn(
|
|
358
319
|
...isWrapped ? dataListRowInteractiveStyles : dataListRowStyles,
|
|
359
320
|
"text-left",
|
|
360
|
-
!isWrapped && flushLeft && "ml-0!",
|
|
361
|
-
!isWrapped && flushRight && "mr-0!",
|
|
362
321
|
// `!` so the selection fill wins over borderless table root styling
|
|
363
322
|
// (higher-specificity descendant rules); same color in `default`.
|
|
364
|
-
featured && "bg-
|
|
323
|
+
featured && "bg-surface-row-featured!",
|
|
365
324
|
dataListRowVariants({ variant }),
|
|
366
325
|
className
|
|
367
326
|
),
|
|
@@ -380,8 +339,6 @@ function DataListRowLink({
|
|
|
380
339
|
className,
|
|
381
340
|
style,
|
|
382
341
|
LinkComponent: Link = "a",
|
|
383
|
-
flushLeft,
|
|
384
|
-
flushRight,
|
|
385
342
|
colStart,
|
|
386
343
|
colEnd,
|
|
387
344
|
featured,
|
|
@@ -397,11 +354,9 @@ function DataListRowLink({
|
|
|
397
354
|
href: to,
|
|
398
355
|
className: cn(
|
|
399
356
|
...isWrapped ? dataListRowInteractiveStyles : dataListRowStyles,
|
|
400
|
-
!isWrapped && flushLeft && "ml-0!",
|
|
401
|
-
!isWrapped && flushRight && "mr-0!",
|
|
402
357
|
// `!` so the selection fill wins over borderless table root styling
|
|
403
358
|
// (higher-specificity descendant rules); same color in `default`.
|
|
404
|
-
featured && "bg-
|
|
359
|
+
featured && "bg-surface-row-featured!",
|
|
405
360
|
dataListRowVariants({ variant }),
|
|
406
361
|
className
|
|
407
362
|
),
|
|
@@ -414,15 +369,7 @@ function DataListRowLink({
|
|
|
414
369
|
|
|
415
370
|
const DataListRowWrapper = forwardRef(
|
|
416
371
|
({ children, className, ...rest }, ref) => {
|
|
417
|
-
return /* @__PURE__ */ jsx(DataListRowWrapperContext.Provider, { value: true, children: /* @__PURE__ */ jsx(
|
|
418
|
-
"div",
|
|
419
|
-
{
|
|
420
|
-
ref,
|
|
421
|
-
className: cn("mx-1 grid grid-cols-subgrid gap-0", ...dataListRowOuterStyles, className),
|
|
422
|
-
...rest,
|
|
423
|
-
children
|
|
424
|
-
}
|
|
425
|
-
) });
|
|
372
|
+
return /* @__PURE__ */ jsx(DataListRowWrapperContext.Provider, { value: true, children: /* @__PURE__ */ jsx("div", { ref, className: cn("grid grid-cols-subgrid gap-0", ...dataListRowOuterStyles, className), ...rest, children }) });
|
|
426
373
|
}
|
|
427
374
|
);
|
|
428
375
|
DataListRowWrapper.displayName = "DataListRowWrapper";
|
|
@@ -437,7 +384,7 @@ function DataListTop({ children, className, hasLeadingCell, ...props }) {
|
|
|
437
384
|
"div",
|
|
438
385
|
{
|
|
439
386
|
className: cn(
|
|
440
|
-
|
|
387
|
+
"group/data-list-top data-list-top sticky top-0 z-20 col-span-full grid grid-cols-subgrid gap-8 px-5",
|
|
441
388
|
hasLeadingCell && "gap-0 pl-0!",
|
|
442
389
|
className
|
|
443
390
|
),
|
|
@@ -456,9 +403,9 @@ const DataListTopCell = forwardRef(
|
|
|
456
403
|
{
|
|
457
404
|
ref,
|
|
458
405
|
className: cn(
|
|
459
|
-
"flex h-
|
|
406
|
+
"flex h-10 max-w-full min-w-0 items-center overflow-hidden py-1 text-ui-sm font-medium whitespace-nowrap text-neutral2",
|
|
460
407
|
sticky === "start" && dataListStickyStartStyles,
|
|
461
|
-
sticky === "start" && "-mr-4 -ml-5 w-auto max-w-none rounded-
|
|
408
|
+
sticky === "start" && "-mr-4 -ml-5 w-auto max-w-none rounded-l-lg pr-4 pl-5",
|
|
462
409
|
sticky === "start" && "z-20 bg-[var(--data-list-sticky-header-background)]",
|
|
463
410
|
className
|
|
464
411
|
),
|
|
@@ -504,12 +451,15 @@ function DataListTopSelectCell({ checked, onToggle, ...rest }) {
|
|
|
504
451
|
DataListTopCell,
|
|
505
452
|
{
|
|
506
453
|
as: "label",
|
|
507
|
-
className:
|
|
454
|
+
className: cn(
|
|
455
|
+
"w-8 cursor-pointer justify-center overflow-visible px-0 py-0!",
|
|
456
|
+
checked === false && dataListTopRevealStyles
|
|
457
|
+
),
|
|
508
458
|
onClick: (e) => e.stopPropagation(),
|
|
509
459
|
children: /* @__PURE__ */ jsx(Checkbox, { checked, onCheckedChange: () => onToggle(), "aria-label": rest["aria-label"] })
|
|
510
460
|
}
|
|
511
461
|
);
|
|
512
462
|
}
|
|
513
463
|
|
|
514
|
-
export { DataListRoot as D, DataListCell as a,
|
|
515
|
-
//# sourceMappingURL=data-list-top-cell-
|
|
464
|
+
export { DataListRoot as D, DataListCell as a, DataListTextCell as b, DataListNextPageLoading as c, dataListRowOuterStyles as d, DataListTimeCell as e, DataListDateCell as f, DataListNoMatch as g, DataListSpacer as h, DataListRowLink as i, DataListRowButton as j, DataListRowWrapper as k, DataListTopCellSmart as l, DataListTopCellWithTooltip as m, DataListTopCell as n, DataListTop as o, DataListIdCell as p, dataListRowVariants as q, dataListRowStaticStyles as r, DataListTopSelectCell as s, DataListSelectCell as t, useDataListRowWrapperContext as u, DataListNumberCell as v, DataListRowHeaderCell as w, DataListDescriptionCell as x, DataListNameCell as y, DataListActionsCell as z };
|
|
465
|
+
//# sourceMappingURL=data-list-top-cell-CC5jjv5s.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-list-top-cell-CC5jjv5s.js","sources":["../src/ds/components/DataList/shared.ts","../src/ds/components/DataList/data-list-cells.tsx","../src/ds/components/DataList/data-list-next-page-loading.tsx","../src/ds/components/DataList/data-list-no-match.tsx","../src/ds/components/DataList/data-list-root.tsx","../src/ds/components/DataList/data-list-row-wrapper-context.ts","../src/ds/components/DataList/data-list-row-button.tsx","../src/ds/components/DataList/data-list-row-link.tsx","../src/ds/components/DataList/data-list-row-wrapper.tsx","../src/ds/components/DataList/data-list-spacer.tsx","../src/ds/components/DataList/data-list-top.tsx","../src/ds/components/DataList/data-list-top-cell.tsx"],"sourcesContent":["/**\n * Row-level styling for the element that participates in the row sibling\n * chain — applied to `DataList.RowButton` / `DataList.RowLink` when used\n * standalone, and to `DataList.RowWrapper` when used as a shell around them.\n *\n * Carries the `.data-list-row` marker class the root styles target.\n */\nexport const dataListRowOuterStyles = [\n 'group/data-list-row data-list-row col-span-full relative min-h-9',\n 'transition-colors duration-200 rounded-lg',\n] as const;\n\n/**\n * Layout + focus ring only. The root paints the hover/focus fill on\n * `.data-list-row`, so a wrapped row and its button never show two tints.\n */\nexport const dataListRowInteractiveStyles = [\n 'grid grid-cols-subgrid gap-8 px-5 outline-none cursor-pointer',\n 'focus-visible:ring-1 focus-visible:ring-inset focus-visible:ring-accent1',\n 'transition-colors duration-200 rounded-lg',\n] as const;\n\nexport const dataListRowStyles = [...dataListRowInteractiveStyles, ...dataListRowOuterStyles] as const;\n\nexport const dataListRowStaticStyles = ['grid grid-cols-subgrid gap-8 px-5', ...dataListRowOuterStyles] as const;\n\n/**\n * Row controls that stay out of the way until the row is hovered or focused.\n * Opacity, not display, so the column keeps its width and nothing shifts. A\n * coarse pointer never hovers, so there they stay visible — hidden controls\n * that still take taps would be worse than no reveal at all.\n */\nexport const dataListRowRevealStyles =\n 'opacity-0 pointer-coarse:opacity-100 group-focus-within/data-list-row:opacity-100 group-hover/data-list-row:opacity-100';\n\n/** Header counterpart of {@link dataListRowRevealStyles}. */\nexport const dataListTopRevealStyles =\n 'opacity-0 pointer-coarse:opacity-100 group-focus-within/data-list-top:opacity-100 group-hover/data-list-top:opacity-100';\n\nimport { cva } from 'class-variance-authority';\n\nexport type DataListSticky = 'start';\n\nexport const dataListStickyStartStyles = [\n 'data-list-sticky-start sticky left-0 z-10 isolate self-stretch overflow-visible',\n 'after:absolute after:-right-4 after:top-1/2 after:-translate-y-1/2 after:h-4 after:w-px after:bg-border2 after:content-[\"\"] after:pointer-events-none',\n] as const;\n\n/** Tone for a single row. `error` lays a subtle, theme-aware destructive tint\n * over whatever background the row already has. */\nexport type DataListRowVariant = 'default' | 'error';\n\n/**\n * Per-row tone. Kept as a `.ts` cva (safe to export — no react-refresh concern).\n * The error tint uses `!` so it wins over borderless table root-level styling\n * (higher-specificity descendant rules) and over the base row hover.\n */\nexport const dataListRowVariants = cva('', {\n variants: {\n variant: {\n default: '',\n error: 'bg-notice-destructive/10! hover:bg-notice-destructive/15!',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n});\n\n/**\n * Layout/state modifiers shared by interactive row primitives\n * (`DataList.RowButton`, `DataList.RowLink`).\n */\nexport type DataListRowSharedProps = {\n /** Row tone — `error` applies a subtle destructive background tint. */\n variant?: DataListRowVariant;\n /**\n * Place the row starting at this column line. Defaults to column 1. Use\n * when the row sits beside a leading cell that owns column 1.\n */\n colStart?: number;\n /**\n * Place the row ending at this column line (use negative values to count\n * from the end, e.g. `-2`). Defaults to `-1` (the last line). Use when the\n * row sits beside a trailing cell that owns the last column.\n */\n colEnd?: number;\n /**\n * Apply the highlighted background. Use to mark the row that is currently\n * featured (e.g. the row whose detail is open in a side panel).\n */\n featured?: boolean;\n};\n","import { format, isToday } from 'date-fns';\nimport { Children, cloneElement, isValidElement } from 'react';\nimport type { ComponentPropsWithoutRef, ElementType, ReactNode } from 'react';\nimport { dataListRowRevealStyles, dataListStickyStartStyles } from './shared';\nimport type { DataListSticky } from './shared';\nimport { Checkbox } from '@/ds/components/Checkbox';\nimport { cn } from '@/lib/utils';\n\nexport type DataListCellProps = {\n children?: ReactNode;\n className?: string;\n /**\n * HTML element rendered for the cell. Defaults to `span`. Use `'label'` when\n * the cell wraps a labelable control (e.g. a Checkbox), so the whole cell\n * area acts as the click/hover target.\n */\n as?: ElementType;\n /**\n * Pins the cell to the horizontal start edge of the list while the list\n * scrolls sideways.\n */\n sticky?: DataListSticky;\n} & Omit<ComponentPropsWithoutRef<'div'>, 'children' | 'className'>;\n\nexport function DataListCell({ children, className, as, sticky, ...rest }: DataListCellProps) {\n const Component = as || 'span';\n return (\n <Component\n className={cn(\n 'relative grid max-w-full min-w-0 items-center overflow-hidden text-ui-md whitespace-nowrap text-neutral3 empty:before:text-neutral2 empty:before:content-[\"—\"]',\n sticky === 'start' && dataListStickyStartStyles,\n className,\n )}\n {...rest}\n >\n {children}\n </Component>\n );\n}\n\n/**\n * Trailing cell for row actions, revealed on row hover or keyboard focus.\n * Sits beside a `DataList.RowButton` inside a `DataList.RowWrapper`.\n */\nexport function DataListActionsCell({ children, className, ...rest }: DataListCellProps) {\n return (\n <DataListCell className={className} {...rest}>\n <span\n className={cn(\n 'flex w-full items-center justify-end gap-1 pr-3 transition-opacity duration-200',\n dataListRowRevealStyles,\n )}\n >\n {children}\n </span>\n </DataListCell>\n );\n}\n\nconst dataListTruncateContentStyles =\n 'block min-w-0 max-w-full truncate empty:before:content-[\"—\"] empty:before:text-neutral2 [&>*]:min-w-0 [&>*]:max-w-full [&>*]:overflow-hidden [&>*]:text-ellipsis [&>*]:whitespace-nowrap';\nconst dataListInlineTextTruncateStyles = 'min-w-0 flex-1 truncate';\n\nfunction DataListInlineText({ children }: { children: string | number }) {\n return <span className={dataListInlineTextTruncateStyles}>{children}</span>;\n}\n\nfunction DataListTruncatedTextNodes({ children }: { children: ReactNode }) {\n return Children.map(children, child => {\n if (typeof child === 'string' || typeof child === 'number') {\n return <DataListInlineText>{child}</DataListInlineText>;\n }\n\n return child;\n });\n}\n\nfunction DataListTruncatedCellContent({ children }: { children: ReactNode }) {\n return Children.map(children, child => {\n if (!isValidElement<{ children?: ReactNode; className?: string }>(child) || typeof child.type !== 'string') {\n return child;\n }\n\n return cloneElement(child, {\n className: cn('max-w-full min-w-0 overflow-hidden', child.props.className),\n children: <DataListTruncatedTextNodes>{child.props.children}</DataListTruncatedTextNodes>,\n });\n });\n}\n\nexport type DataListTextCellProps = DataListCellProps & {\n /**\n * Typeface for the cell text. `mono` is for genuine code — paths, env values,\n * serialized JSON — and drops a size step to match the sans columns optically.\n */\n font?: 'sans' | 'mono';\n};\n\nexport function DataListTextCell({ children, className, font = 'sans', ...rest }: DataListTextCellProps) {\n return (\n <DataListCell className={cn(font === 'mono' && 'font-mono text-ui-smd', className)} {...rest}>\n <span className={dataListTruncateContentStyles}>\n <DataListTruncatedCellContent>{children}</DataListTruncatedCellContent>\n </span>\n </DataListCell>\n );\n}\n\nexport function DataListNameCell({ children, className }: DataListCellProps) {\n return (\n <DataListCell className={cn('text-left font-medium text-neutral4', className)}>\n <span className={dataListTruncateContentStyles}>\n <DataListTruncatedCellContent>{children}</DataListTruncatedCellContent>\n </span>\n </DataListCell>\n );\n}\n\nexport function DataListDescriptionCell({ children, className }: DataListCellProps) {\n return (\n <DataListCell className={cn('text-neutral2', className)}>\n <span className={dataListTruncateContentStyles}>\n <DataListTruncatedCellContent>{children}</DataListTruncatedCellContent>\n </span>\n </DataListCell>\n );\n}\n\nexport type DataListRowHeaderCellProps = Omit<DataListCellProps, 'sticky'>;\n\nexport function DataListRowHeaderCell({ children, className, ...rest }: DataListRowHeaderCellProps) {\n return (\n <DataListCell\n sticky=\"start\"\n className={cn(\n 'data-list-row-header -mr-4 -ml-5 w-auto max-w-none rounded-l-lg pr-4 pl-5 text-left text-ui-sm font-medium text-neutral2',\n className,\n )}\n {...rest}\n >\n <span className={cn(dataListTruncateContentStyles, 'relative z-10 w-full')}>\n <DataListTruncatedCellContent>{children}</DataListTruncatedCellContent>\n </span>\n </DataListCell>\n );\n}\n\nexport type DataListNumberCellProps = DataListCellProps & {\n /**\n * Emphasizes the value with a brighter tone and semibold weight — use for the\n * primary metric in a row (e.g. a total or headline number).\n */\n highlight?: boolean;\n};\n\n/**\n * Right-aligned numeric cell with tabular figures, for metric and summary\n * tables. Pass `highlight` for the emphasized column.\n */\nexport function DataListNumberCell({ children, className, highlight, ...rest }: DataListNumberCellProps) {\n return (\n <DataListCell\n className={cn(\n 'justify-items-end text-right text-ui-sm tabular-nums',\n highlight ? 'font-semibold text-neutral4' : 'text-neutral3',\n className,\n )}\n {...rest}\n >\n {children}\n </DataListCell>\n );\n}\n\nfunction getShortId(id: string | undefined): string {\n return id?.slice(0, 8) ?? '';\n}\n\nexport interface DataListIdCellProps {\n id: string;\n}\n\nexport function DataListIdCell({ id }: DataListIdCellProps) {\n return <DataListCell className=\"text-ui-smd text-neutral3 tracking-wide\">{getShortId(id)}</DataListCell>;\n}\n\nexport interface DataListSelectCellProps {\n checked: boolean;\n /**\n * Called when the checkbox is clicked. Receives the click event's `shiftKey`\n * so callers can implement range-select. The cell stops the click from\n * reaching the host row, so the row's `onClick` doesn't fire.\n */\n onToggle: (shiftKey: boolean) => void;\n /** Disable the checkbox, e.g. while a selection mutation is in flight. */\n disabled?: boolean;\n 'aria-label'?: string;\n}\n\nexport function DataListSelectCell({ checked, onToggle, disabled, ...rest }: DataListSelectCellProps) {\n return (\n <DataListCell\n as=\"label\"\n className={cn(\n 'size-8 justify-items-center self-center overflow-visible px-0',\n !checked && dataListRowRevealStyles,\n disabled ? 'cursor-not-allowed' : 'cursor-pointer',\n )}\n onClick={e => e.stopPropagation()}\n >\n <Checkbox\n checked={checked}\n disabled={disabled}\n onCheckedChange={() => {}} // no-op: selection handled by onClick to capture shiftKey\n // The click still has to bubble to the cell above, which is what keeps it\n // off the host row. Base UI withholds this handler while disabled.\n onClick={e => onToggle(e.shiftKey)}\n aria-label={rest['aria-label']}\n />\n </DataListCell>\n );\n}\n\nfunction toDate(value: Date | string): Date | null {\n const date = value instanceof Date ? value : new Date(value);\n return isNaN(date.getTime()) ? null : date;\n}\n\nexport interface DataListDateCellProps {\n timestamp: Date | string;\n}\n\n/** Compact date cell — `Today` or `MMM dd` (e.g. `May 19`). */\nexport function DataListDateCell({ timestamp }: DataListDateCellProps) {\n const date = toDate(timestamp);\n return (\n <DataListCell className=\"text-ui-smd text-neutral2\">\n {date ? (isToday(date) ? 'Today' : format(date, 'MMM dd')) : null}\n </DataListCell>\n );\n}\n\nexport interface DataListTimeCellProps {\n timestamp: Date | string;\n}\n\nexport function DataListTimeCell({ timestamp }: DataListTimeCellProps) {\n const date = toDate(timestamp);\n return (\n <DataListCell className=\"text-ui-smd text-neutral3 flex tabular-nums\">\n {date ? (\n <>\n {format(date, 'h:mm:ss')}\n <span className=\"text-neutral2\">\n .{String(date.getMilliseconds()).padStart(3, '0')} {format(date, 'aaa')}\n </span>\n </>\n ) : null}\n </DataListCell>\n );\n}\n","import { cn } from '@/lib/utils';\n\nexport type DataListNextPageLoadingProps = {\n isLoading?: boolean;\n hasMore?: boolean;\n setEndOfListElement?: (element: HTMLDivElement | null) => void;\n loadingText?: string;\n};\n\nexport function DataListNextPageLoading({\n isLoading,\n setEndOfListElement,\n hasMore,\n loadingText = 'Loading more data...',\n}: DataListNextPageLoadingProps) {\n if (!setEndOfListElement) {\n return null;\n }\n\n return (\n <div\n ref={setEndOfListElement}\n className={cn('col-span-full flex min-h-1 justify-center text-ui-md text-neutral3 opacity-50', {\n 'py-4': isLoading,\n 'py-0': !hasMore,\n })}\n >\n {isLoading && loadingText}\n </div>\n );\n}\n","import type { ComponentPropsWithoutRef } from 'react';\nimport { cn } from '@/lib/utils';\n\nexport type DataListNoMatchProps = ComponentPropsWithoutRef<'div'> & {\n message?: string;\n};\n\nexport function DataListNoMatch({\n message = 'Nothing matches your search',\n className,\n ...props\n}: DataListNoMatchProps) {\n return (\n <div\n className={cn('col-span-full flex flex-col items-center justify-center gap-2 py-12 text-neutral3', className)}\n {...props}\n >\n <p className=\"text-ui-md\">{message}</p>\n </div>\n );\n}\n","import { cva } from 'class-variance-authority';\nimport type { CSSProperties, ReactNode, RefObject } from 'react';\nimport { ScrollArea } from '@/ds/components/ScrollArea/scroll-area';\nimport type { ScrollAreaMask, ScrollAreaProps } from '@/ds/components/ScrollArea/scroll-area';\nimport { cn } from '@/lib/utils';\n\n/**\n * Visual treatment for the whole list.\n *\n * Both are borderless and full-bleed, with a contrasting sticky header band and\n * no row separators. `striped` adds a zebra tint to every other row; `plain`\n * leaves rows transparent so only hover and selection tint them.\n */\nexport type DataListVariant = 'striped' | 'plain';\n\n/**\n * Horizontal sizing of the list grid.\n *\n * - `content`: the grid is as wide as its widest content (`w-max`) and the\n * ScrollArea scrolls horizontally when it exceeds the container.\n * - `container`: the grid fills the container width and never exceeds it;\n * flexible tracks (`minmax(0, 1fr)`) shrink so truncating cells ellipsize\n * instead of widening the table.\n */\nexport type DataListFit = 'content' | 'container';\nexport type DataListStickyHeaderBackground = 'tinted' | 'surface' | 'transparent';\ntype DataListStickyHeaderBackgroundValue = { background: string; hoverBackground: string };\n\nexport type DataListRootProps = Omit<ScrollAreaProps, 'children' | 'orientation' | 'mask' | 'viewportRef'> & {\n children: ReactNode;\n columns: string;\n variant?: DataListVariant;\n /** Grid width behavior; defaults to `content` (existing horizontal-scroll sizing). */\n fit?: DataListFit;\n /**\n * Shared fill for the sticky top header and sticky row-header column.\n * `tinted` is the opaque `--surface-header` band, so sticky headers do not\n * reveal scrolled content beneath them.\n */\n stickyHeaderBackground?: DataListStickyHeaderBackground;\n /**\n * Edge fades from the underlying ScrollArea. DataList keeps the top fade off\n * by default so it does not fade the sticky top header.\n */\n mask?: ScrollAreaMask;\n /**\n * Ref to the scroll container — pass this to TanStack Virtual's\n * `getScrollElement` when virtualizing. Without it, the ScrollArea viewport\n * scrolls normally.\n */\n scrollRef?: RefObject<HTMLDivElement | null>;\n};\n\nconst stickyHeaderBackgroundValues = {\n tinted: {\n background: 'var(--surface-header)',\n hoverBackground: 'var(--surface-header-hover)',\n },\n surface: {\n background: 'var(--surface2)',\n hoverBackground: 'color-mix(in oklch, var(--surface2), var(--neutral6) 10%)',\n },\n transparent: {\n background: 'transparent',\n hoverBackground: 'transparent',\n },\n} satisfies Record<DataListStickyHeaderBackground, DataListStickyHeaderBackgroundValue>;\n\ntype DataListRootStyle = CSSProperties & {\n '--data-list-sticky-header-background'?: string;\n '--data-list-sticky-header-hover-background'?: string;\n};\n\nfunction getDataListMask(mask: ScrollAreaMask | undefined): ScrollAreaMask {\n if (mask === undefined) return { top: false };\n if (typeof mask === 'object') return { top: false, ...mask };\n\n return mask;\n}\n\n/**\n * Root grid styling per `variant`. Kept module-private (an exported cva in a\n * `.tsx` trips react-refresh). The borderless table treatments are driven\n * entirely from the root with CSS descendant selectors on the `.data-list-top` /\n * `.data-list-row` markers - the header and row primitives stay untouched, no JS\n * per-row index:\n * - no container fill or border: rows composite over any view.\n * - `gap-y-px`: a uniform 1px gap between every grid track (header and rows).\n * - header: a contrasting band that owns its own radius, no hairline.\n * - rows: full-bleed, so the grid gap is the only spacing. Header, rows and\n * subheader all share `rounded-lg`.\n * - striped adds translucent zebra tints with `:even`; hover & focus use `!` so\n * they still win over root-level row styling.\n */\nconst borderlessTableStyles = [\n 'gap-y-px',\n // A shared opaque tint gives both column headers and sticky row headers the\n // same treatment without revealing scrolled content beneath sticky surfaces.\n '[&_.data-list-top]:bg-[var(--data-list-sticky-header-background)] [&_.data-list-top]:rounded-lg',\n '[&_.data-list-row]:rounded-lg',\n '[&_.data-list-row]:hover:bg-surface-overlay-strong!',\n '[&_.data-list-row:focus-within]:bg-surface-overlay-strong!',\n '[&_.data-list-row>.data-list-sticky-start]:bg-[var(--data-list-sticky-header-background)]',\n '[&_.data-list-row>.data-list-sticky-start]:after:right-0',\n '[&_.data-list-row:hover>.data-list-sticky-start]:bg-[var(--data-list-sticky-header-hover-background)]',\n '[&_.data-list-row:focus-within>.data-list-sticky-start]:bg-[var(--data-list-sticky-header-hover-background)]',\n '[&_.data-list-top>.data-list-sticky-start]:after:right-0',\n] as const;\n\nconst dataListFitClasses: Record<DataListFit, string> = {\n content: 'w-max max-w-none min-w-full',\n container: 'w-full max-w-full',\n};\n\nconst dataListRootVariants = cva(cn('grid content-start', ...borderlessTableStyles), {\n variants: {\n variant: {\n striped: '[&_.data-list-row]:even:bg-surface-overlay-soft',\n plain: '',\n },\n },\n defaultVariants: {\n variant: 'plain',\n },\n});\n\nexport function DataListRoot({\n children,\n columns,\n className,\n variant = 'plain',\n fit = 'content',\n stickyHeaderBackground = 'tinted',\n mask,\n scrollRef,\n ...props\n}: DataListRootProps) {\n const stickyHeaderColors = stickyHeaderBackgroundValues[stickyHeaderBackground];\n const gridStyle: DataListRootStyle = {\n '--data-list-sticky-header-background': stickyHeaderColors.background,\n '--data-list-sticky-header-hover-background': stickyHeaderColors.hoverBackground,\n gridTemplateColumns: columns,\n };\n\n const grid = (\n <div\n // Lists scroll inside the ScrollArea viewport (below); the grid just lays out.\n className={cn(dataListRootVariants({ variant }), dataListFitClasses[fit])}\n style={gridStyle}\n >\n {children}\n </div>\n );\n\n // DataList uses the DS ScrollArea: an overlay scrollbar, so the sticky header\n // spans the full width. Masks default to every overflowing edge except the\n // top — a top fade would fade the opaque sticky header. A virtualizing list\n // passes `scrollRef`, forwarded as `viewportRef` so it scrolls this viewport.\n return (\n <ScrollArea\n {...props}\n orientation=\"both\"\n mask={getDataListMask(mask)}\n viewportRef={scrollRef}\n viewPortClassName=\"max-h-[inherit]\"\n className={cn('size-full', className)}\n >\n {grid}\n </ScrollArea>\n );\n}\n","import { createContext, useContext } from 'react';\n\nexport const DataListRowWrapperContext = createContext(false);\n\nexport function useDataListRowWrapperContext() {\n return useContext(DataListRowWrapperContext);\n}\n","import { forwardRef } from 'react';\nimport type { ComponentPropsWithoutRef } from 'react';\nimport { useDataListRowWrapperContext } from './data-list-row-wrapper-context';\nimport { dataListRowInteractiveStyles, dataListRowStyles, dataListRowVariants } from './shared';\nimport type { DataListRowSharedProps } from './shared';\nimport { cn } from '@/lib/utils';\n\nexport type DataListRowButtonProps = ComponentPropsWithoutRef<'button'> & DataListRowSharedProps;\n\n/**\n * Forwarded ref + spread props so virtualizers (`useVirtualizer.measureElement`)\n * can attach a ref and `data-index` to each rendered row.\n */\nexport const DataListRowButton = forwardRef<HTMLButtonElement, DataListRowButtonProps>(\n ({ children, className, type = 'button', colStart, colEnd, featured, variant, style, ...rest }, ref) => {\n const isWrapped = useDataListRowWrapperContext();\n const hasColumnOverride = colStart !== undefined || colEnd !== undefined;\n const resolvedStyle = hasColumnOverride ? { ...style, gridColumn: `${colStart ?? 1} / ${colEnd ?? -1}` } : style;\n return (\n <button\n ref={ref}\n type={type}\n className={cn(\n ...(isWrapped ? dataListRowInteractiveStyles : dataListRowStyles),\n 'text-left',\n // `!` so the selection fill wins over borderless table root styling\n // (higher-specificity descendant rules); same color in `default`.\n featured && 'bg-surface-row-featured!',\n dataListRowVariants({ variant }),\n className,\n )}\n style={resolvedStyle}\n {...rest}\n >\n {children}\n </button>\n );\n },\n);\n\nDataListRowButton.displayName = 'DataListRowButton';\n","import type { CSSProperties, ComponentPropsWithoutRef, ReactNode } from 'react';\nimport { useDataListRowWrapperContext } from './data-list-row-wrapper-context';\nimport { dataListRowInteractiveStyles, dataListRowStyles, dataListRowVariants } from './shared';\nimport type { DataListRowSharedProps } from './shared';\nimport type { LinkComponent } from '@/ds/types/link-component';\nimport { cn } from '@/lib/utils';\n\nexport type DataListRowLinkProps = DataListRowSharedProps & {\n children: ReactNode;\n to: string;\n className?: string;\n style?: CSSProperties;\n LinkComponent?: LinkComponent;\n} & Omit<ComponentPropsWithoutRef<'a'>, 'href' | 'children' | 'className' | 'style'>;\n\nexport function DataListRowLink({\n children,\n to,\n className,\n style,\n LinkComponent: Link = 'a',\n colStart,\n colEnd,\n featured,\n variant,\n ...rest\n}: DataListRowLinkProps) {\n const isWrapped = useDataListRowWrapperContext();\n const hasColumnOverride = colStart !== undefined || colEnd !== undefined;\n const resolvedStyle = hasColumnOverride ? { ...style, gridColumn: `${colStart ?? 1} / ${colEnd ?? -1}` } : style;\n return (\n <Link\n href={to}\n className={cn(\n ...(isWrapped ? dataListRowInteractiveStyles : dataListRowStyles),\n // `!` so the selection fill wins over borderless table root styling\n // (higher-specificity descendant rules); same color in `default`.\n featured && 'bg-surface-row-featured!',\n dataListRowVariants({ variant }),\n className,\n )}\n style={resolvedStyle}\n {...rest}\n >\n {children}\n </Link>\n );\n}\n","import { forwardRef } from 'react';\nimport type { ComponentPropsWithoutRef } from 'react';\nimport { DataListRowWrapperContext } from './data-list-row-wrapper-context';\nimport { dataListRowOuterStyles } from './shared';\nimport { cn } from '@/lib/utils';\n\nexport type DataListRowWrapperProps = ComponentPropsWithoutRef<'div'>;\n\n/**\n * Non-interactive grid wrapper. Used to host a leading or trailing cell (e.g. a\n * selection checkbox or row actions) alongside a `DataList.RowButton` so\n * hover/focus/click only apply to the button portion. For standalone\n * interactive rows, use `DataList.RowButton` directly without this wrapper.\n *\n * Carries the `.data-list-row` marker so root-level row styling behaves the\n * same in wrapped and standalone rows.\n */\nexport const DataListRowWrapper = forwardRef<HTMLDivElement, DataListRowWrapperProps>(\n ({ children, className, ...rest }, ref) => {\n return (\n <DataListRowWrapperContext.Provider value>\n <div ref={ref} className={cn('grid grid-cols-subgrid gap-0', ...dataListRowOuterStyles, className)} {...rest}>\n {children}\n </div>\n </DataListRowWrapperContext.Provider>\n );\n },\n);\n\nDataListRowWrapper.displayName = 'DataListRowWrapper';\n","export type DataListSpacerProps = {\n /** Pixel height of the spacer. Pass 0 to render nothing. */\n height: number;\n};\n\n/**\n * Pads top/bottom of the visible window when virtualizing — preserves the\n * grid's total scroll height for the rows that aren't currently rendered.\n * Spans the full grid width so it doesn't disturb column layout.\n */\nexport function DataListSpacer({ height }: DataListSpacerProps) {\n if (height <= 0) return null;\n return <div className=\"col-span-full\" style={{ height }} />;\n}\n","import type { ComponentPropsWithoutRef } from 'react';\nimport { cn } from '@/lib/utils';\n\nexport type DataListTopProps = ComponentPropsWithoutRef<'div'> & {\n /**\n * Switch to a \"leading cell\" layout: drops the default gap between children\n * and the default left padding, so a leading cell (e.g. `TopSelectCell`)\n * sits flush against the grid edge and an inner `TopCells` group owns the\n * remaining column spacing. Mirrors how `Row` + `RowButton` compose.\n */\n hasLeadingCell?: boolean;\n};\n\nexport function DataListTop({ children, className, hasLeadingCell, ...props }: DataListTopProps) {\n return (\n <div\n className={cn(\n 'group/data-list-top data-list-top sticky top-0 z-20 col-span-full grid grid-cols-subgrid gap-8 px-5',\n hasLeadingCell && 'gap-0 pl-0!',\n className,\n )}\n {...props}\n >\n {children}\n </div>\n );\n}\n","import type { ComponentPropsWithoutRef, ElementType, ReactNode } from 'react';\nimport { forwardRef } from 'react';\nimport { dataListStickyStartStyles, dataListTopRevealStyles } from './shared';\nimport type { DataListSticky } from './shared';\nimport { Checkbox } from '@/ds/components/Checkbox';\nimport { Tooltip, TooltipTrigger, TooltipContent } from '@/ds/components/Tooltip';\nimport { cn } from '@/lib/utils';\n\nexport type DataListTopCellProps = {\n children: ReactNode;\n className?: string;\n /**\n * HTML element rendered for the top cell. Defaults to `span`. Use `'label'`\n * when the cell wraps a labelable control (e.g. a select-all Checkbox).\n */\n as?: ElementType;\n /** Pins the top cell to the horizontal start edge while the list scrolls sideways. */\n sticky?: DataListSticky;\n} & Omit<ComponentPropsWithoutRef<'div'>, 'children' | 'className' | 'ref'>;\n\nexport const DataListTopCell = forwardRef<HTMLSpanElement, DataListTopCellProps>(\n ({ children, className, as, sticky, ...rest }, ref) => {\n const Component = as || 'span';\n const isText = typeof children === 'string' || typeof children === 'number';\n return (\n <Component\n ref={ref}\n className={cn(\n 'flex h-10 max-w-full min-w-0 items-center overflow-hidden py-1 text-ui-sm font-medium whitespace-nowrap text-neutral2',\n sticky === 'start' && dataListStickyStartStyles,\n sticky === 'start' && '-mr-4 -ml-5 w-auto max-w-none rounded-l-lg pr-4 pl-5',\n sticky === 'start' && 'z-20 bg-[var(--data-list-sticky-header-background)]',\n className,\n )}\n {...rest}\n >\n {/* Plain string/number titles truncate with an ellipsis; element children\n (icons, smart long/short labels, checkboxes) render as-is. */}\n {isText ? <span className=\"min-w-0 truncate\">{children}</span> : children}\n </Component>\n );\n },\n);\n\nexport type DataListTopCellWithTooltipProps = {\n children: ReactNode;\n tooltip: ReactNode;\n className?: string;\n};\n\nexport function DataListTopCellWithTooltip({ children, tooltip, className }: DataListTopCellWithTooltipProps) {\n return (\n <Tooltip>\n <TooltipTrigger>\n <DataListTopCell className={className}>{children}</DataListTopCell>\n </TooltipTrigger>\n <TooltipContent>{tooltip}</TooltipContent>\n </Tooltip>\n );\n}\n\nexport type DataListTopCellSmartProps = {\n long: ReactNode;\n short: ReactNode;\n tooltip?: string;\n breakpoint?: 'sm' | 'md' | 'lg' | 'xl' | '2xl';\n className?: string;\n};\n\nconst breakpointClasses: Record<'sm' | 'md' | 'lg' | 'xl' | '2xl', { show: string; hide: string }> = {\n sm: { show: 'hidden sm:inline-flex', hide: 'inline-flex sm:hidden' },\n md: { show: 'hidden md:inline-flex', hide: 'inline-flex md:hidden' },\n lg: { show: 'hidden lg:inline-flex', hide: 'inline-flex lg:hidden' },\n xl: { show: 'hidden xl:inline-flex', hide: 'inline-flex xl:hidden' },\n '2xl': { show: 'hidden 2xl:inline-flex', hide: 'inline-flex 2xl:hidden' },\n};\n\nexport function DataListTopCellSmart({\n long,\n short,\n tooltip,\n breakpoint = '2xl',\n className,\n}: DataListTopCellSmartProps) {\n const tooltipText = tooltip ?? (typeof long === 'string' ? long : undefined);\n const bp = breakpointClasses[breakpoint];\n\n const content = (\n <>\n <span className={cn('items-center gap-1', bp.show)}>{long}</span>\n <span className={cn('items-center gap-1', bp.hide)}>{short}</span>\n </>\n );\n\n if (tooltipText) {\n return (\n <DataListTopCellWithTooltip tooltip={tooltipText} className={cn('flex [&_svg]:size-[1.3em]', className)}>\n {content}\n </DataListTopCellWithTooltip>\n );\n }\n\n return <DataListTopCell className={cn('flex [&_svg]:size-[1.3em]', className)}>{content}</DataListTopCell>;\n}\n\nexport interface DataListTopSelectCellProps {\n /** Pass `'indeterminate'` when some — but not all — rows are selected. */\n checked: boolean | 'indeterminate';\n /** Toggles the global selection. Typically clears when fully selected, otherwise selects all. */\n onToggle: () => void;\n 'aria-label'?: string;\n}\n\nexport function DataListTopSelectCell({ checked, onToggle, ...rest }: DataListTopSelectCellProps) {\n return (\n <DataListTopCell\n as=\"label\"\n className={cn(\n 'w-8 cursor-pointer justify-center overflow-visible px-0 py-0!',\n checked === false && dataListTopRevealStyles,\n )}\n onClick={e => e.stopPropagation()}\n >\n <Checkbox checked={checked} onCheckedChange={() => onToggle()} aria-label={rest['aria-label']} />\n </DataListTopCell>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -5,9 +5,9 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
|
5
5
|
const jsxRuntime = require('react/jsx-runtime');
|
|
6
6
|
const reactVirtual = require('@tanstack/react-virtual');
|
|
7
7
|
const React = require('react');
|
|
8
|
-
const dataListSkeleton = require('../../../data-list-skeleton-
|
|
8
|
+
const dataListSkeleton = require('../../../data-list-skeleton-BHBSIQHN.cjs');
|
|
9
9
|
const useDataListKeyboard = require('../../../use-data-list-keyboard-k5D-WlNX.cjs');
|
|
10
|
-
const logsDataList = require('../../../logs-data-list-
|
|
10
|
+
const logsDataList = require('../../../logs-data-list-Xayqbjw4.cjs');
|
|
11
11
|
|
|
12
12
|
const COLUMNS = "6rem 9rem 5rem 10rem minmax(8rem,1fr) minmax(8rem,1fr)";
|
|
13
13
|
const ROW_HEIGHT = 36;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
2
2
|
import { useVirtualizer } from '@tanstack/react-virtual';
|
|
3
3
|
import { useRef, useEffect } from 'react';
|
|
4
|
-
import { D as DataListSkeleton } from '../../../data-list-skeleton-
|
|
4
|
+
import { D as DataListSkeleton } from '../../../data-list-skeleton-DDO_OE14.js';
|
|
5
5
|
import { u as useDataListKeyboard } from '../../../use-data-list-keyboard-BzZmvqE_.js';
|
|
6
|
-
import { L as LogsDataList } from '../../../logs-data-list-
|
|
6
|
+
import { L as LogsDataList } from '../../../logs-data-list-DRXJ89IZ.js';
|
|
7
7
|
|
|
8
8
|
const COLUMNS = "6rem 9rem 5rem 10rem minmax(8rem,1fr) minmax(8rem,1fr)";
|
|
9
9
|
const ROW_HEIGHT = 36;
|
|
@@ -4,7 +4,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
|
4
4
|
|
|
5
5
|
const jsxRuntime = require('react/jsx-runtime');
|
|
6
6
|
const React = require('react');
|
|
7
|
-
const dataList = require('../../../data-list-
|
|
7
|
+
const dataList = require('../../../data-list-CCacNODd.cjs');
|
|
8
8
|
const metricsCard = require('../../../metrics-card-DmbKNY3U.cjs');
|
|
9
9
|
const tabsContent = require('../../../tabs-content-wBU5qmb6.cjs');
|
|
10
10
|
const tabsRoot = require('../../../tabs-root-VtBc6K2q.cjs');
|
|
@@ -67,7 +67,7 @@ function MemoryCardView({
|
|
|
67
67
|
threadRows.map((row) => {
|
|
68
68
|
const href = getThreadRowHref?.(row);
|
|
69
69
|
const rowCells = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
70
|
-
/* @__PURE__ */ jsxRuntime.jsx(dataList.DataList.RowHeaderCell, {
|
|
70
|
+
/* @__PURE__ */ jsxRuntime.jsx(dataList.DataList.RowHeaderCell, { className: "text-ui-sm", children: shortId(row.threadId) }),
|
|
71
71
|
/* @__PURE__ */ jsxRuntime.jsx(dataList.DataList.NumberCell, { children: row.resourceId ? shortId(row.resourceId) : "—" }),
|
|
72
72
|
/* @__PURE__ */ jsxRuntime.jsx(dataList.DataList.NumberCell, { highlight: true, children: row.runs.toLocaleString() }),
|
|
73
73
|
/* @__PURE__ */ jsxRuntime.jsx(dataList.DataList.NumberCell, { children: row.tokens > 0 ? domains_metrics_components_metricsUtils.formatCompact(row.tokens) : "—" }),
|
|
@@ -86,7 +86,7 @@ function MemoryCardView({
|
|
|
86
86
|
resourceRows.map((row) => {
|
|
87
87
|
const href = getResourceRowHref?.(row);
|
|
88
88
|
const rowCells = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
89
|
-
/* @__PURE__ */ jsxRuntime.jsx(dataList.DataList.RowHeaderCell, {
|
|
89
|
+
/* @__PURE__ */ jsxRuntime.jsx(dataList.DataList.RowHeaderCell, { className: "text-ui-sm", children: shortId(row.resourceId) }),
|
|
90
90
|
/* @__PURE__ */ jsxRuntime.jsx(dataList.DataList.NumberCell, { highlight: true, children: row.threadCount.toLocaleString() }),
|
|
91
91
|
/* @__PURE__ */ jsxRuntime.jsx(dataList.DataList.NumberCell, { children: row.tokens > 0 ? domains_metrics_components_metricsUtils.formatCompact(row.tokens) : "—" }),
|
|
92
92
|
/* @__PURE__ */ jsxRuntime.jsx(dataList.DataList.NumberCell, { children: row.cost != null ? domains_metrics_components_metricsUtils.formatCost(row.cost, row.costUnit) : "—" })
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-card-view.cjs.js","sources":["../../../../src/domains/metrics/components/memory-card-view.tsx"],"sourcesContent":["import { useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { DataList } from '../../../ds/components/DataList/data-list';\nimport { MetricsCard } from '../../../ds/components/MetricsCard/metrics-card';\nimport { TabContent } from '../../../ds/components/Tabs/tabs-content';\nimport { TabList } from '../../../ds/components/Tabs/tabs-list';\nimport { Tabs } from '../../../ds/components/Tabs/tabs-root';\nimport { Tab } from '../../../ds/components/Tabs/tabs-tab';\nimport type { LinkComponent } from '../../../ds/types/link-component';\nimport type { ActiveThreadRow } from '../hooks/use-top-active-threads-metrics';\nimport type { ResourceThreadsRow } from '../hooks/use-top-resources-by-threads-metrics';\nimport { formatCompact, formatCost, METRICS_DATA_LIST_PROPS } from './metrics-utils';\n\nexport type MemoryTab = 'threads' | 'resources';\n\n/** Per-tab query state. Memory has two independent server queries (top\n * threads + top resources) so loading/error are scoped to the active tab. */\ntype MemoryTabState<T> = {\n data: T[] | undefined;\n isLoading: boolean;\n isError: boolean;\n};\n\nexport interface MemoryCardViewProps {\n threads: MemoryTabState<ActiveThreadRow>;\n resources: MemoryTabState<ResourceThreadsRow>;\n /** Optional drilldown for a thread row. Receives the raw hook row. */\n getThreadRowHref?: (row: ActiveThreadRow) => string | undefined;\n /** Optional drilldown for a resource row. Receives the raw hook row. */\n getResourceRowHref?: (row: ResourceThreadsRow) => string | undefined;\n /** Optional slot for top-bar action buttons. Function form receives the active tab. */\n actions?: ReactNode | ((tab: MemoryTab) => ReactNode);\n /** Override how drilldown links are rendered. Defaults to `<a>`. */\n LinkComponent?: LinkComponent;\n}\n\nfunction isMemoryTab(value: string): value is MemoryTab {\n return value === 'threads' || value === 'resources';\n}\n\n// IDs are usually 32+ char UUIDs; the table is too narrow to show the full\n// value without horizontal scroll, so we elide the middle.\nfunction shortId(id: string): string {\n if (id.length <= 12) return id;\n return `${id.slice(0, 6)}…${id.slice(-4)}`;\n}\n\ntype ThreadTableRow = ActiveThreadRow & { key: string };\ntype ResourceTableRow = ResourceThreadsRow & { key: string };\n\nexport function MemoryCardView({\n threads,\n resources,\n getThreadRowHref,\n getResourceRowHref,\n actions,\n LinkComponent,\n}: MemoryCardViewProps) {\n const [activeTab, setActiveTab] = useState<MemoryTab>('threads');\n\n const threadRows: ThreadTableRow[] = threads.data?.map(r => ({ ...r, key: r.threadId })) ?? [];\n const resourceRows: ResourceTableRow[] = resources.data?.map(r => ({ ...r, key: r.resourceId })) ?? [];\n\n const hasThreadData = threadRows.length > 0;\n const hasResourceData = resourceRows.length > 0;\n\n const threadTotal = threads.data?.reduce((s, r) => s + r.runs, 0) ?? 0;\n const resourceTotal = resources.data?.reduce((s, r) => s + r.threadCount, 0) ?? 0;\n\n const active = activeTab === 'threads' ? threads : resources;\n const renderedActions = typeof actions === 'function' ? actions(activeTab) : actions;\n\n return (\n <MetricsCard>\n <MetricsCard.TopBar>\n <MetricsCard.TitleAndDescription title=\"Memory\" description=\"Resource and Thread consumption\" />\n {activeTab === 'threads' && hasThreadData && (\n <MetricsCard.Summary value={threadTotal.toLocaleString()} label=\"Total runs\" />\n )}\n {activeTab === 'resources' && hasResourceData && (\n <MetricsCard.Summary value={resourceTotal.toLocaleString()} label=\"Total threads\" />\n )}\n {renderedActions ? <MetricsCard.Actions>{renderedActions}</MetricsCard.Actions> : null}\n </MetricsCard.TopBar>\n {active.isLoading ? (\n <MetricsCard.Loading />\n ) : active.isError ? (\n <MetricsCard.Error message=\"Failed to load memory data\" />\n ) : (\n <MetricsCard.Content>\n <Tabs\n defaultTab=\"threads\"\n value={activeTab}\n onValueChange={v => {\n if (isMemoryTab(v)) setActiveTab(v);\n }}\n className=\"grid h-full grid-rows-[auto_1fr] overflow-y-auto\"\n >\n <TabList>\n <Tab value=\"threads\">Threads</Tab>\n <Tab value=\"resources\">Resources</Tab>\n </TabList>\n <TabContent value=\"threads\">\n {hasThreadData ? (\n <DataList columns=\"auto auto auto auto auto\" {...METRICS_DATA_LIST_PROPS}>\n <DataList.Top>\n <DataList.TopCell sticky=\"start\">Thread ID</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Resource ID</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Runs</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Tokens</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Cost</DataList.TopCell>\n </DataList.Top>\n {threadRows.map(row => {\n const href = getThreadRowHref?.(row);\n const rowCells = (\n <>\n <DataList.RowHeaderCell height=\"compact\" className=\"text-ui-sm\">\n {shortId(row.threadId)}\n </DataList.RowHeaderCell>\n <DataList.NumberCell>{row.resourceId ? shortId(row.resourceId) : '—'}</DataList.NumberCell>\n <DataList.NumberCell highlight>{row.runs.toLocaleString()}</DataList.NumberCell>\n <DataList.NumberCell>{row.tokens > 0 ? formatCompact(row.tokens) : '—'}</DataList.NumberCell>\n <DataList.NumberCell>\n {row.cost != null ? formatCost(row.cost, row.costUnit) : '—'}\n </DataList.NumberCell>\n </>\n );\n\n return href ? (\n <DataList.RowLink key={row.key} to={href} LinkComponent={LinkComponent}>\n {rowCells}\n </DataList.RowLink>\n ) : (\n <DataList.RowStatic key={row.key}>{rowCells}</DataList.RowStatic>\n );\n })}\n </DataList>\n ) : (\n <MetricsCard.NoData message=\"No thread activity yet\" />\n )}\n </TabContent>\n <TabContent value=\"resources\">\n {hasResourceData ? (\n <DataList columns=\"auto auto auto auto\" {...METRICS_DATA_LIST_PROPS}>\n <DataList.Top>\n <DataList.TopCell sticky=\"start\">Resource ID</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Threads</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Tokens</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Cost</DataList.TopCell>\n </DataList.Top>\n {resourceRows.map(row => {\n const href = getResourceRowHref?.(row);\n const rowCells = (\n <>\n <DataList.RowHeaderCell height=\"compact\" className=\"text-ui-sm\">\n {shortId(row.resourceId)}\n </DataList.RowHeaderCell>\n <DataList.NumberCell highlight>{row.threadCount.toLocaleString()}</DataList.NumberCell>\n <DataList.NumberCell>{row.tokens > 0 ? formatCompact(row.tokens) : '—'}</DataList.NumberCell>\n <DataList.NumberCell>\n {row.cost != null ? formatCost(row.cost, row.costUnit) : '—'}\n </DataList.NumberCell>\n </>\n );\n\n return href ? (\n <DataList.RowLink key={row.key} to={href} LinkComponent={LinkComponent}>\n {rowCells}\n </DataList.RowLink>\n ) : (\n <DataList.RowStatic key={row.key}>{rowCells}</DataList.RowStatic>\n );\n })}\n </DataList>\n ) : (\n <MetricsCard.NoData message=\"No resource activity yet\" />\n )}\n </TabContent>\n </Tabs>\n </MetricsCard.Content>\n )}\n </MetricsCard>\n );\n}\n"],"names":["useState","MetricsCard","jsxs","jsx","Tabs","TabList","Tab","TabContent","DataList","METRICS_DATA_LIST_PROPS","Fragment","formatCompact","formatCost"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"memory-card-view.cjs.js","sources":["../../../../src/domains/metrics/components/memory-card-view.tsx"],"sourcesContent":["import { useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { DataList } from '../../../ds/components/DataList/data-list';\nimport { MetricsCard } from '../../../ds/components/MetricsCard/metrics-card';\nimport { TabContent } from '../../../ds/components/Tabs/tabs-content';\nimport { TabList } from '../../../ds/components/Tabs/tabs-list';\nimport { Tabs } from '../../../ds/components/Tabs/tabs-root';\nimport { Tab } from '../../../ds/components/Tabs/tabs-tab';\nimport type { LinkComponent } from '../../../ds/types/link-component';\nimport type { ActiveThreadRow } from '../hooks/use-top-active-threads-metrics';\nimport type { ResourceThreadsRow } from '../hooks/use-top-resources-by-threads-metrics';\nimport { formatCompact, formatCost, METRICS_DATA_LIST_PROPS } from './metrics-utils';\n\nexport type MemoryTab = 'threads' | 'resources';\n\n/** Per-tab query state. Memory has two independent server queries (top\n * threads + top resources) so loading/error are scoped to the active tab. */\ntype MemoryTabState<T> = {\n data: T[] | undefined;\n isLoading: boolean;\n isError: boolean;\n};\n\nexport interface MemoryCardViewProps {\n threads: MemoryTabState<ActiveThreadRow>;\n resources: MemoryTabState<ResourceThreadsRow>;\n /** Optional drilldown for a thread row. Receives the raw hook row. */\n getThreadRowHref?: (row: ActiveThreadRow) => string | undefined;\n /** Optional drilldown for a resource row. Receives the raw hook row. */\n getResourceRowHref?: (row: ResourceThreadsRow) => string | undefined;\n /** Optional slot for top-bar action buttons. Function form receives the active tab. */\n actions?: ReactNode | ((tab: MemoryTab) => ReactNode);\n /** Override how drilldown links are rendered. Defaults to `<a>`. */\n LinkComponent?: LinkComponent;\n}\n\nfunction isMemoryTab(value: string): value is MemoryTab {\n return value === 'threads' || value === 'resources';\n}\n\n// IDs are usually 32+ char UUIDs; the table is too narrow to show the full\n// value without horizontal scroll, so we elide the middle.\nfunction shortId(id: string): string {\n if (id.length <= 12) return id;\n return `${id.slice(0, 6)}…${id.slice(-4)}`;\n}\n\ntype ThreadTableRow = ActiveThreadRow & { key: string };\ntype ResourceTableRow = ResourceThreadsRow & { key: string };\n\nexport function MemoryCardView({\n threads,\n resources,\n getThreadRowHref,\n getResourceRowHref,\n actions,\n LinkComponent,\n}: MemoryCardViewProps) {\n const [activeTab, setActiveTab] = useState<MemoryTab>('threads');\n\n const threadRows: ThreadTableRow[] = threads.data?.map(r => ({ ...r, key: r.threadId })) ?? [];\n const resourceRows: ResourceTableRow[] = resources.data?.map(r => ({ ...r, key: r.resourceId })) ?? [];\n\n const hasThreadData = threadRows.length > 0;\n const hasResourceData = resourceRows.length > 0;\n\n const threadTotal = threads.data?.reduce((s, r) => s + r.runs, 0) ?? 0;\n const resourceTotal = resources.data?.reduce((s, r) => s + r.threadCount, 0) ?? 0;\n\n const active = activeTab === 'threads' ? threads : resources;\n const renderedActions = typeof actions === 'function' ? actions(activeTab) : actions;\n\n return (\n <MetricsCard>\n <MetricsCard.TopBar>\n <MetricsCard.TitleAndDescription title=\"Memory\" description=\"Resource and Thread consumption\" />\n {activeTab === 'threads' && hasThreadData && (\n <MetricsCard.Summary value={threadTotal.toLocaleString()} label=\"Total runs\" />\n )}\n {activeTab === 'resources' && hasResourceData && (\n <MetricsCard.Summary value={resourceTotal.toLocaleString()} label=\"Total threads\" />\n )}\n {renderedActions ? <MetricsCard.Actions>{renderedActions}</MetricsCard.Actions> : null}\n </MetricsCard.TopBar>\n {active.isLoading ? (\n <MetricsCard.Loading />\n ) : active.isError ? (\n <MetricsCard.Error message=\"Failed to load memory data\" />\n ) : (\n <MetricsCard.Content>\n <Tabs\n defaultTab=\"threads\"\n value={activeTab}\n onValueChange={v => {\n if (isMemoryTab(v)) setActiveTab(v);\n }}\n className=\"grid h-full grid-rows-[auto_1fr] overflow-y-auto\"\n >\n <TabList>\n <Tab value=\"threads\">Threads</Tab>\n <Tab value=\"resources\">Resources</Tab>\n </TabList>\n <TabContent value=\"threads\">\n {hasThreadData ? (\n <DataList columns=\"auto auto auto auto auto\" {...METRICS_DATA_LIST_PROPS}>\n <DataList.Top>\n <DataList.TopCell sticky=\"start\">Thread ID</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Resource ID</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Runs</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Tokens</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Cost</DataList.TopCell>\n </DataList.Top>\n {threadRows.map(row => {\n const href = getThreadRowHref?.(row);\n const rowCells = (\n <>\n <DataList.RowHeaderCell className=\"text-ui-sm\">{shortId(row.threadId)}</DataList.RowHeaderCell>\n <DataList.NumberCell>{row.resourceId ? shortId(row.resourceId) : '—'}</DataList.NumberCell>\n <DataList.NumberCell highlight>{row.runs.toLocaleString()}</DataList.NumberCell>\n <DataList.NumberCell>{row.tokens > 0 ? formatCompact(row.tokens) : '—'}</DataList.NumberCell>\n <DataList.NumberCell>\n {row.cost != null ? formatCost(row.cost, row.costUnit) : '—'}\n </DataList.NumberCell>\n </>\n );\n\n return href ? (\n <DataList.RowLink key={row.key} to={href} LinkComponent={LinkComponent}>\n {rowCells}\n </DataList.RowLink>\n ) : (\n <DataList.RowStatic key={row.key}>{rowCells}</DataList.RowStatic>\n );\n })}\n </DataList>\n ) : (\n <MetricsCard.NoData message=\"No thread activity yet\" />\n )}\n </TabContent>\n <TabContent value=\"resources\">\n {hasResourceData ? (\n <DataList columns=\"auto auto auto auto\" {...METRICS_DATA_LIST_PROPS}>\n <DataList.Top>\n <DataList.TopCell sticky=\"start\">Resource ID</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Threads</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Tokens</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Cost</DataList.TopCell>\n </DataList.Top>\n {resourceRows.map(row => {\n const href = getResourceRowHref?.(row);\n const rowCells = (\n <>\n <DataList.RowHeaderCell className=\"text-ui-sm\">\n {shortId(row.resourceId)}\n </DataList.RowHeaderCell>\n <DataList.NumberCell highlight>{row.threadCount.toLocaleString()}</DataList.NumberCell>\n <DataList.NumberCell>{row.tokens > 0 ? formatCompact(row.tokens) : '—'}</DataList.NumberCell>\n <DataList.NumberCell>\n {row.cost != null ? formatCost(row.cost, row.costUnit) : '—'}\n </DataList.NumberCell>\n </>\n );\n\n return href ? (\n <DataList.RowLink key={row.key} to={href} LinkComponent={LinkComponent}>\n {rowCells}\n </DataList.RowLink>\n ) : (\n <DataList.RowStatic key={row.key}>{rowCells}</DataList.RowStatic>\n );\n })}\n </DataList>\n ) : (\n <MetricsCard.NoData message=\"No resource activity yet\" />\n )}\n </TabContent>\n </Tabs>\n </MetricsCard.Content>\n )}\n </MetricsCard>\n );\n}\n"],"names":["useState","MetricsCard","jsxs","jsx","Tabs","TabList","Tab","TabContent","DataList","METRICS_DATA_LIST_PROPS","Fragment","formatCompact","formatCost"],"mappings":"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"}
|