@mastra/playground-ui 52.0.0 → 53.0.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/dist/{command-C2XK36se.cjs → command-CUev1UxH.cjs} +2 -2
- package/dist/{command-C2XK36se.cjs.map → command-CUev1UxH.cjs.map} +1 -1
- package/dist/{command-ehL7-lrV.js → command-DWFd0d4c.js} +2 -2
- package/dist/{command-ehL7-lrV.js.map → command-DWFd0d4c.js.map} +1 -1
- package/dist/components/Breadcrumb.cjs.js +1 -1
- package/dist/components/Breadcrumb.cjs.js.map +1 -1
- package/dist/components/Breadcrumb.es.js +1 -1
- package/dist/components/Breadcrumb.es.js.map +1 -1
- package/dist/components/Command.cjs.js +1 -1
- package/dist/components/Command.es.js +1 -1
- package/dist/components/CommandPalette.cjs.js +2 -2
- package/dist/components/CommandPalette.es.js +2 -2
- package/dist/components/Composer.cjs.js +1 -1
- package/dist/components/Composer.es.js +1 -1
- package/dist/components/DataList.cjs.js +4 -4
- package/dist/components/DataList.es.js +4 -4
- package/dist/components/EnvironmentVariablesEditor.cjs.js +12 -23
- package/dist/components/EnvironmentVariablesEditor.cjs.js.map +1 -1
- package/dist/components/EnvironmentVariablesEditor.es.js +12 -23
- package/dist/components/EnvironmentVariablesEditor.es.js.map +1 -1
- package/dist/components/HorizontalBars.cjs.js +1 -1
- package/dist/components/HorizontalBars.es.js +1 -1
- package/dist/components/LogsDataList.cjs.js +2 -2
- package/dist/components/LogsDataList.es.js +2 -2
- package/dist/components/MainSidebar.cjs.js +1 -1
- package/dist/components/MainSidebar.es.js +1 -1
- package/dist/components/PageLayout.cjs.js +1 -1
- package/dist/components/PageLayout.es.js +1 -1
- package/dist/components/ScrollArea.cjs.js +1 -1
- package/dist/components/ScrollArea.es.js +1 -1
- package/dist/components/ThemeToggle.cjs.js +36 -10
- package/dist/components/ThemeToggle.cjs.js.map +1 -1
- package/dist/components/ThemeToggle.es.js +36 -10
- package/dist/components/ThemeToggle.es.js.map +1 -1
- package/dist/components/ThreadRail.cjs.js +1 -1
- package/dist/components/ThreadRail.es.js +1 -1
- package/dist/components/ai/task-list.cjs.js +1 -1
- package/dist/components/ai/task-list.es.js +1 -1
- package/dist/{data-list-CB-W-syo.cjs → data-list-B5Wicaoc.cjs} +7 -9
- package/dist/data-list-B5Wicaoc.cjs.map +1 -0
- package/dist/{data-list-DX6y3EFQ.js → data-list-BUK_v9ax.js} +7 -9
- package/dist/data-list-BUK_v9ax.js.map +1 -0
- package/dist/data-list-skeleton-BZR_Hkvj.cjs +38 -0
- package/dist/data-list-skeleton-BZR_Hkvj.cjs.map +1 -0
- package/dist/data-list-skeleton-BoaQlbOY.js +36 -0
- package/dist/data-list-skeleton-BoaQlbOY.js.map +1 -0
- package/dist/{data-list-top-cell-B4H5BBGd.cjs → data-list-top-cell-CIs1L8gy.cjs} +81 -99
- package/dist/data-list-top-cell-CIs1L8gy.cjs.map +1 -0
- package/dist/{data-list-top-cell-CDYczhpP.js → data-list-top-cell-D4-Hbz2H.js} +82 -99
- package/dist/data-list-top-cell-D4-Hbz2H.js.map +1 -0
- package/dist/domains/logs/components/logs-list-view.cjs.js +3 -3
- package/dist/domains/logs/components/logs-list-view.cjs.js.map +1 -1
- package/dist/domains/logs/components/logs-list-view.es.js +3 -3
- package/dist/domains/logs/components/logs-list-view.es.js.map +1 -1
- package/dist/domains/metrics/components/memory-card-view.cjs.js +1 -1
- package/dist/domains/metrics/components/memory-card-view.es.js +1 -1
- package/dist/domains/metrics/components/metrics-utils.cjs.js +1 -2
- package/dist/domains/metrics/components/metrics-utils.cjs.js.map +1 -1
- package/dist/domains/metrics/components/metrics-utils.es.js +1 -2
- package/dist/domains/metrics/components/metrics-utils.es.js.map +1 -1
- package/dist/domains/metrics/components/model-usage-cost-card-view.cjs.js +1 -1
- package/dist/domains/metrics/components/model-usage-cost-card-view.es.js +1 -1
- package/dist/domains/metrics/components/scores-card-view.cjs.js +1 -1
- package/dist/domains/metrics/components/scores-card-view.es.js +1 -1
- package/dist/domains/metrics/components/token-usage-by-agent-card-view.cjs.js +1 -1
- package/dist/domains/metrics/components/token-usage-by-agent-card-view.es.js +1 -1
- package/dist/domains/metrics/components/traces-volume-card-view.cjs.js +1 -1
- package/dist/domains/metrics/components/traces-volume-card-view.es.js +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/signals/components/entity-index-compact-grid.cjs.js +1 -1
- package/dist/ee/signals/components/entity-index-compact-grid.es.js +1 -1
- package/dist/ee/signals/components/entity-index-list.cjs.js +1 -1
- package/dist/ee/signals/components/entity-index-list.es.js +1 -1
- package/dist/ee/signals/components/trace-intelligence-entity-detail.cjs.js +1 -1
- package/dist/ee/signals/components/trace-intelligence-entity-detail.es.js +1 -1
- package/dist/ee/signals/components/trace-intelligence-entity-index.cjs.js +2 -2
- package/dist/ee/signals/components/trace-intelligence-entity-index.es.js +2 -2
- 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/hooks/use-debounced-value.cjs.js +17 -0
- package/dist/hooks/use-debounced-value.cjs.js.map +1 -0
- package/dist/hooks/use-debounced-value.d.ts +2 -0
- package/dist/hooks/use-debounced-value.es.js +13 -0
- package/dist/hooks/use-debounced-value.es.js.map +1 -0
- package/dist/{horizontal-bars-CV2XRu4w.cjs → horizontal-bars-CE1O-Y6G.cjs} +2 -2
- package/dist/{horizontal-bars-CV2XRu4w.cjs.map → horizontal-bars-CE1O-Y6G.cjs.map} +1 -1
- package/dist/{horizontal-bars-3vH3FLj3.js → horizontal-bars-DZ5J4TKv.js} +2 -2
- package/dist/{horizontal-bars-3vH3FLj3.js.map → horizontal-bars-DZ5J4TKv.js.map} +1 -1
- package/dist/{logs-data-list-CTnwPG40.cjs → logs-data-list-PExVAYf3.cjs} +2 -2
- package/dist/{logs-data-list-CTnwPG40.cjs.map → logs-data-list-PExVAYf3.cjs.map} +1 -1
- package/dist/{logs-data-list-btJapa0s.js → logs-data-list-VCTqogr3.js} +2 -2
- package/dist/{logs-data-list-btJapa0s.js.map → logs-data-list-VCTqogr3.js.map} +1 -1
- package/dist/{no-data-page-layout-CkhD1Xwb.js → no-data-page-layout-BB6l1JBu.js} +2 -2
- package/dist/no-data-page-layout-BB6l1JBu.js.map +1 -0
- package/dist/{no-data-page-layout-CBJ50ULk.cjs → no-data-page-layout-DxgToazD.cjs} +2 -2
- package/dist/no-data-page-layout-DxgToazD.cjs.map +1 -0
- package/dist/{scroll-area-D_-TyC0c.cjs → scroll-area-B1vdOFuC.cjs} +5 -5
- package/dist/{scroll-area-D_-TyC0c.cjs.map → scroll-area-B1vdOFuC.cjs.map} +1 -1
- package/dist/{scroll-area-DVSQTnjk.js → scroll-area-BiHnOfzg.js} +5 -5
- package/dist/{scroll-area-DVSQTnjk.js.map → scroll-area-BiHnOfzg.js.map} +1 -1
- package/dist/src/domains/metrics/components/metrics-utils.d.ts +0 -1
- package/dist/src/ds/components/Card/Card.d.ts +2 -2
- package/dist/src/ds/components/DataList/data-list-root.d.ts +10 -17
- package/dist/src/ds/components/DataList/data-list-skeleton.d.ts +7 -2
- package/dist/src/ds/components/DataList/data-list.d.ts +1 -1
- package/dist/src/ds/components/DataList/data-list.stories.d.ts +15 -41
- package/dist/src/ds/components/DataList/shared.d.ts +19 -24
- package/dist/src/ds/components/EnvironmentVariablesEditor/environment-variables-editor-read-only-list.d.ts +1 -1
- package/dist/src/ds/components/LogsDataList/logs-data-list.stories.d.ts +0 -1
- package/dist/src/ds/components/ThemeToggle/theme-toggle.d.ts +25 -1
- package/dist/src/ds/components/ThemeToggle/theme-toggle.stories.d.ts +3 -0
- package/dist/src/hooks/use-debounced-value.d.ts +1 -0
- package/dist/style.css +113 -130
- package/dist/{traces-data-list-BeSOHzvZ.js → traces-data-list-BnK1mfZp.js} +3 -3
- package/dist/{traces-data-list-BeSOHzvZ.js.map → traces-data-list-BnK1mfZp.js.map} +1 -1
- package/dist/{traces-data-list-DwwFFIeq.cjs → traces-data-list-MX4shJfG.cjs} +3 -3
- package/dist/{traces-data-list-DwwFFIeq.cjs.map → traces-data-list-MX4shJfG.cjs.map} +1 -1
- package/package.json +7 -7
- package/dist/data-list-CB-W-syo.cjs.map +0 -1
- package/dist/data-list-DX6y3EFQ.js.map +0 -1
- package/dist/data-list-skeleton-C2R2CO9G.js +0 -34
- package/dist/data-list-skeleton-C2R2CO9G.js.map +0 -1
- package/dist/data-list-skeleton-hTX1b2Au.cjs +0 -36
- package/dist/data-list-skeleton-hTX1b2Au.cjs.map +0 -1
- package/dist/data-list-top-cell-B4H5BBGd.cjs.map +0 -1
- package/dist/data-list-top-cell-CDYczhpP.js.map +0 -1
- package/dist/no-data-page-layout-CBJ50ULk.cjs.map +0 -1
- package/dist/no-data-page-layout-CkhD1Xwb.js.map +0 -1
|
@@ -3,38 +3,33 @@ import { format, isToday } from 'date-fns';
|
|
|
3
3
|
import { Children, isValidElement, cloneElement, useContext, createContext, forwardRef } from 'react';
|
|
4
4
|
import { C as Checkbox } from './checkbox-84QCxKJf.js';
|
|
5
5
|
import { c as cn } from './cn-B4oPhFx9.js';
|
|
6
|
-
import {
|
|
7
|
-
import { S as ScrollArea } from './scroll-area-DVSQTnjk.js';
|
|
6
|
+
import { S as ScrollArea } from './scroll-area-BiHnOfzg.js';
|
|
8
7
|
import { T as Tooltip, c as TooltipTrigger, a as TooltipContent } from './tooltip-Bi0pDO5P.js';
|
|
9
8
|
|
|
10
9
|
const dataListRowOuterStyles = [
|
|
11
|
-
"group/data-list-row data-list-row col-span-full relative min-h-9",
|
|
12
|
-
"transition-colors duration-200
|
|
10
|
+
"group/data-list-row data-list-row col-span-full relative min-h-9 bg-surface2",
|
|
11
|
+
"transition-colors duration-200"
|
|
12
|
+
];
|
|
13
|
+
const dataListRowStateStyles = [
|
|
14
|
+
"hover:bg-surface3 active:bg-surface4",
|
|
15
|
+
"data-featured:bg-surface3 has-data-featured:bg-surface3 has-data-selected:bg-surface3",
|
|
16
|
+
"data-featured:hover:bg-surface4 has-data-featured:hover:bg-surface4 has-data-selected:hover:bg-surface4",
|
|
17
|
+
"data-[variant=error]:bg-notice-destructive/10 has-data-[variant=error]:bg-notice-destructive/10"
|
|
13
18
|
];
|
|
14
19
|
const dataListRowInteractiveStyles = [
|
|
15
|
-
"grid grid-cols-subgrid gap-8 px-5
|
|
16
|
-
"focus-visible:ring-1 focus-visible:ring-inset focus-visible:ring-accent1"
|
|
17
|
-
|
|
20
|
+
"grid grid-cols-subgrid gap-8 px-5 cursor-pointer",
|
|
21
|
+
"outline-none focus-visible:ring-1 focus-visible:ring-inset focus-visible:ring-accent1"
|
|
22
|
+
];
|
|
23
|
+
const dataListRowStyles = [
|
|
24
|
+
...dataListRowInteractiveStyles,
|
|
25
|
+
...dataListRowOuterStyles,
|
|
26
|
+
...dataListRowStateStyles
|
|
18
27
|
];
|
|
19
|
-
const dataListRowStyles = [...dataListRowInteractiveStyles, ...dataListRowOuterStyles];
|
|
20
28
|
const dataListRowStaticStyles = ["grid grid-cols-subgrid gap-8 px-5", ...dataListRowOuterStyles];
|
|
21
|
-
const
|
|
22
|
-
const dataListTopRevealStyles = "opacity-0 pointer-coarse:opacity-100 group-focus-within/data-list-top:opacity-100 group-hover/data-list-top:opacity-100";
|
|
29
|
+
const dataListRowActionRevealStyles = "opacity-0 pointer-coarse:opacity-100 group-focus-within/data-list-row:opacity-100 group-hover/data-list-row:opacity-100";
|
|
23
30
|
const dataListStickyStartStyles = [
|
|
24
|
-
"data-list-sticky-start sticky left-0 z-10 isolate self-stretch overflow-visible"
|
|
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'
|
|
31
|
+
"data-list-sticky-start sticky left-0 z-10 isolate self-stretch overflow-visible"
|
|
26
32
|
];
|
|
27
|
-
const dataListRowVariants = cva("", {
|
|
28
|
-
variants: {
|
|
29
|
-
variant: {
|
|
30
|
-
default: "",
|
|
31
|
-
error: "bg-notice-destructive/10! hover:bg-notice-destructive/15!"
|
|
32
|
-
}
|
|
33
|
-
},
|
|
34
|
-
defaultVariants: {
|
|
35
|
-
variant: "default"
|
|
36
|
-
}
|
|
37
|
-
});
|
|
38
33
|
|
|
39
34
|
function DataListCell({ children, className, as, sticky, ...rest }) {
|
|
40
35
|
const Component = as || "span";
|
|
@@ -57,7 +52,7 @@ function DataListActionsCell({ children, className, ...rest }) {
|
|
|
57
52
|
{
|
|
58
53
|
className: cn(
|
|
59
54
|
"flex w-full items-center justify-end gap-1 pr-3 transition-opacity duration-200",
|
|
60
|
-
|
|
55
|
+
dataListRowActionRevealStyles
|
|
61
56
|
),
|
|
62
57
|
children
|
|
63
58
|
}
|
|
@@ -102,7 +97,7 @@ function DataListRowHeaderCell({ children, className, ...rest }) {
|
|
|
102
97
|
{
|
|
103
98
|
sticky: "start",
|
|
104
99
|
className: cn(
|
|
105
|
-
"data-list-row-header -mr-4 -ml-5 w-auto max-w-none
|
|
100
|
+
"data-list-row-header -mr-4 -ml-5 w-auto max-w-none pr-4 pl-5 text-left text-ui-sm font-medium text-neutral2",
|
|
106
101
|
className
|
|
107
102
|
),
|
|
108
103
|
...rest,
|
|
@@ -137,10 +132,10 @@ function DataListSelectCell({ checked, onToggle, disabled, ...rest }) {
|
|
|
137
132
|
as: "label",
|
|
138
133
|
className: cn(
|
|
139
134
|
"size-8 justify-items-center self-center overflow-visible px-0",
|
|
140
|
-
!checked && dataListRowRevealStyles,
|
|
141
135
|
disabled ? "cursor-not-allowed" : "cursor-pointer"
|
|
142
136
|
),
|
|
143
137
|
onClick: (e) => e.stopPropagation(),
|
|
138
|
+
"data-selected": checked || void 0,
|
|
144
139
|
children: /* @__PURE__ */ jsx(
|
|
145
140
|
Checkbox,
|
|
146
141
|
{
|
|
@@ -193,9 +188,8 @@ function DataListNextPageLoading({
|
|
|
193
188
|
"div",
|
|
194
189
|
{
|
|
195
190
|
ref: setEndOfListElement,
|
|
196
|
-
className: cn("col-span-full
|
|
197
|
-
"py-4": isLoading
|
|
198
|
-
"py-0": !hasMore
|
|
191
|
+
className: cn("col-span-full -mt-px flex justify-center text-ui-md text-neutral3 opacity-50", {
|
|
192
|
+
"py-4": isLoading
|
|
199
193
|
}),
|
|
200
194
|
children: isLoading && loadingText
|
|
201
195
|
}
|
|
@@ -210,82 +204,68 @@ function DataListNoMatch({
|
|
|
210
204
|
return /* @__PURE__ */ jsx(
|
|
211
205
|
"div",
|
|
212
206
|
{
|
|
213
|
-
className: cn(
|
|
207
|
+
className: cn(
|
|
208
|
+
"col-span-full flex flex-col items-center justify-center gap-2 rounded-lg bg-surface2 py-12 text-neutral3",
|
|
209
|
+
className
|
|
210
|
+
),
|
|
214
211
|
...props,
|
|
215
212
|
children: /* @__PURE__ */ jsx("p", { className: "text-ui-md", children: message })
|
|
216
213
|
}
|
|
217
214
|
);
|
|
218
215
|
}
|
|
219
216
|
|
|
220
|
-
const stickyHeaderBackgroundValues = {
|
|
221
|
-
tinted: {
|
|
222
|
-
background: "var(--surface-header)",
|
|
223
|
-
hoverBackground: "var(--surface-header-hover)"
|
|
224
|
-
},
|
|
225
|
-
surface: {
|
|
226
|
-
background: "var(--surface2)",
|
|
227
|
-
hoverBackground: "color-mix(in oklch, var(--surface2), var(--neutral6) 10%)"
|
|
228
|
-
},
|
|
229
|
-
transparent: {
|
|
230
|
-
background: "transparent",
|
|
231
|
-
hoverBackground: "transparent"
|
|
232
|
-
}
|
|
233
|
-
};
|
|
234
217
|
function getDataListMask(mask) {
|
|
235
218
|
if (mask === void 0) return { top: false };
|
|
236
219
|
if (typeof mask === "object") return { top: false, ...mask };
|
|
237
220
|
return mask;
|
|
238
221
|
}
|
|
239
|
-
const
|
|
222
|
+
const dataListGridStyles = [
|
|
240
223
|
"gap-y-px",
|
|
241
|
-
//
|
|
242
|
-
|
|
243
|
-
"[&_.data-list-
|
|
244
|
-
"[&_.data-list-row]:rounded-lg",
|
|
245
|
-
"[&_.data-list-row
|
|
246
|
-
|
|
247
|
-
"[&_.data-list-
|
|
224
|
+
// Rows are siblings of the header, so first/last are found via sibling combinators.
|
|
225
|
+
"[&_.data-list-row:not(.data-list-row~.data-list-row)]:rounded-t-lg",
|
|
226
|
+
"[&_.data-list-row:not(:has(~.data-list-row))]:rounded-b-lg",
|
|
227
|
+
"[&_.data-list-row:not(.data-list-row~.data-list-row)>.data-list-sticky-start]:rounded-tl-lg",
|
|
228
|
+
"[&_.data-list-row:not(:has(~.data-list-row))>.data-list-sticky-start]:rounded-bl-lg",
|
|
229
|
+
// Subheaders split the rows into sections; each section gets its own rounded ends.
|
|
230
|
+
"[&_.data-list-subheader+.data-list-row]:rounded-t-lg",
|
|
231
|
+
"[&_.data-list-row:has(+.data-list-subheader)]:rounded-b-lg",
|
|
232
|
+
"[&_.data-list-subheader+.data-list-row>.data-list-sticky-start]:rounded-tl-lg",
|
|
233
|
+
"[&_.data-list-row:has(+.data-list-subheader)>.data-list-sticky-start]:rounded-bl-lg",
|
|
234
|
+
"[&_.data-list-top]:bg-(--data-list-background)",
|
|
235
|
+
"[&_.data-list-row>.data-list-sticky-start]:bg-surface2",
|
|
248
236
|
"[&_.data-list-row>.data-list-sticky-start]:after:right-0",
|
|
249
|
-
"[&_.data-list-row:hover>.data-list-sticky-start]:bg-[var(--data-list-sticky-header-hover-background)]",
|
|
250
|
-
"[&_.data-list-row:focus-within>.data-list-sticky-start]:bg-[var(--data-list-sticky-header-hover-background)]",
|
|
251
237
|
"[&_.data-list-top>.data-list-sticky-start]:after:right-0"
|
|
252
238
|
];
|
|
239
|
+
const dataListVariantClasses = {
|
|
240
|
+
default: "bg-surface4",
|
|
241
|
+
light: ""
|
|
242
|
+
};
|
|
243
|
+
const dataListVariantBackground = {
|
|
244
|
+
default: "var(--surface4)",
|
|
245
|
+
light: "var(--surface1)"
|
|
246
|
+
};
|
|
253
247
|
const dataListFitClasses = {
|
|
254
248
|
content: "w-max max-w-none min-w-full",
|
|
255
249
|
container: "w-full max-w-full"
|
|
256
250
|
};
|
|
257
|
-
const dataListRootVariants = cva(cn("grid content-start", ...borderlessTableStyles), {
|
|
258
|
-
variants: {
|
|
259
|
-
variant: {
|
|
260
|
-
striped: "[&_.data-list-row]:even:bg-surface-overlay-soft",
|
|
261
|
-
plain: ""
|
|
262
|
-
}
|
|
263
|
-
},
|
|
264
|
-
defaultVariants: {
|
|
265
|
-
variant: "plain"
|
|
266
|
-
}
|
|
267
|
-
});
|
|
268
251
|
function DataListRoot({
|
|
269
252
|
children,
|
|
270
253
|
columns,
|
|
271
254
|
className,
|
|
272
|
-
variant = "plain",
|
|
273
255
|
fit = "content",
|
|
274
|
-
|
|
256
|
+
variant = "default",
|
|
275
257
|
mask,
|
|
276
258
|
scrollRef,
|
|
277
259
|
...props
|
|
278
260
|
}) {
|
|
279
|
-
const stickyHeaderColors = stickyHeaderBackgroundValues[stickyHeaderBackground];
|
|
280
261
|
const gridStyle = {
|
|
281
|
-
"--data-list-
|
|
282
|
-
"--data-list-sticky-header-hover-background": stickyHeaderColors.hoverBackground,
|
|
262
|
+
"--data-list-background": dataListVariantBackground[variant],
|
|
283
263
|
gridTemplateColumns: columns
|
|
284
264
|
};
|
|
285
265
|
const grid = /* @__PURE__ */ jsx(
|
|
286
266
|
"div",
|
|
287
267
|
{
|
|
288
|
-
className: cn(
|
|
268
|
+
className: cn("grid content-start", ...dataListGridStyles, dataListFitClasses[fit]),
|
|
289
269
|
style: gridStyle,
|
|
290
270
|
children
|
|
291
271
|
}
|
|
@@ -297,8 +277,12 @@ function DataListRoot({
|
|
|
297
277
|
orientation: "both",
|
|
298
278
|
mask: getDataListMask(mask),
|
|
299
279
|
viewportRef: scrollRef,
|
|
300
|
-
viewPortClassName: "
|
|
301
|
-
className: cn(
|
|
280
|
+
viewPortClassName: "min-h-0 flex-1 basis-auto",
|
|
281
|
+
className: cn(
|
|
282
|
+
"flex max-h-full w-full flex-col self-start rounded-xl px-1 pb-1",
|
|
283
|
+
dataListVariantClasses[variant],
|
|
284
|
+
className
|
|
285
|
+
),
|
|
302
286
|
children: grid
|
|
303
287
|
}
|
|
304
288
|
);
|
|
@@ -319,16 +303,10 @@ const DataListRowButton = forwardRef(
|
|
|
319
303
|
{
|
|
320
304
|
ref,
|
|
321
305
|
type,
|
|
322
|
-
className: cn(
|
|
323
|
-
...isWrapped ? dataListRowInteractiveStyles : dataListRowStyles,
|
|
324
|
-
"text-left",
|
|
325
|
-
// `!` so the selection fill wins over borderless table root styling
|
|
326
|
-
// (higher-specificity descendant rules); same color in `default`.
|
|
327
|
-
featured && "bg-surface-row-featured!",
|
|
328
|
-
dataListRowVariants({ variant }),
|
|
329
|
-
className
|
|
330
|
-
),
|
|
306
|
+
className: cn(...isWrapped ? dataListRowInteractiveStyles : dataListRowStyles, "text-left", className),
|
|
331
307
|
style: resolvedStyle,
|
|
308
|
+
"data-featured": featured || void 0,
|
|
309
|
+
"data-variant": variant ?? "default",
|
|
332
310
|
...rest,
|
|
333
311
|
children
|
|
334
312
|
}
|
|
@@ -356,15 +334,10 @@ function DataListRowLink({
|
|
|
356
334
|
Link,
|
|
357
335
|
{
|
|
358
336
|
href: to,
|
|
359
|
-
className: cn(
|
|
360
|
-
...isWrapped ? dataListRowInteractiveStyles : dataListRowStyles,
|
|
361
|
-
// `!` so the selection fill wins over borderless table root styling
|
|
362
|
-
// (higher-specificity descendant rules); same color in `default`.
|
|
363
|
-
featured && "bg-surface-row-featured!",
|
|
364
|
-
dataListRowVariants({ variant }),
|
|
365
|
-
className
|
|
366
|
-
),
|
|
337
|
+
className: cn(...isWrapped ? dataListRowInteractiveStyles : dataListRowStyles, className),
|
|
367
338
|
style: resolvedStyle,
|
|
339
|
+
"data-featured": featured || void 0,
|
|
340
|
+
"data-variant": variant ?? "default",
|
|
368
341
|
...rest,
|
|
369
342
|
children
|
|
370
343
|
}
|
|
@@ -373,7 +346,20 @@ function DataListRowLink({
|
|
|
373
346
|
|
|
374
347
|
const DataListRowWrapper = forwardRef(
|
|
375
348
|
({ children, className, ...rest }, ref) => {
|
|
376
|
-
return /* @__PURE__ */ jsx(DataListRowWrapperContext.Provider, { value: true, children: /* @__PURE__ */ jsx(
|
|
349
|
+
return /* @__PURE__ */ jsx(DataListRowWrapperContext.Provider, { value: true, children: /* @__PURE__ */ jsx(
|
|
350
|
+
"div",
|
|
351
|
+
{
|
|
352
|
+
ref,
|
|
353
|
+
className: cn(
|
|
354
|
+
"grid grid-cols-subgrid gap-0",
|
|
355
|
+
...dataListRowOuterStyles,
|
|
356
|
+
...dataListRowStateStyles,
|
|
357
|
+
className
|
|
358
|
+
),
|
|
359
|
+
...rest,
|
|
360
|
+
children
|
|
361
|
+
}
|
|
362
|
+
) });
|
|
377
363
|
}
|
|
378
364
|
);
|
|
379
365
|
DataListRowWrapper.displayName = "DataListRowWrapper";
|
|
@@ -409,8 +395,8 @@ const DataListTopCell = forwardRef(
|
|
|
409
395
|
className: cn(
|
|
410
396
|
"flex h-10 max-w-full min-w-0 items-center overflow-hidden py-1 text-ui-sm font-medium whitespace-nowrap text-neutral2",
|
|
411
397
|
sticky === "start" && dataListStickyStartStyles,
|
|
412
|
-
sticky === "start" && "-mr-4 -ml-5 w-auto max-w-none
|
|
413
|
-
sticky === "start" && "z-20
|
|
398
|
+
sticky === "start" && "-mr-4 -ml-5 w-auto max-w-none pr-4 pl-5",
|
|
399
|
+
sticky === "start" && "z-20",
|
|
414
400
|
className
|
|
415
401
|
),
|
|
416
402
|
...rest,
|
|
@@ -455,15 +441,12 @@ function DataListTopSelectCell({ checked, onToggle, ...rest }) {
|
|
|
455
441
|
DataListTopCell,
|
|
456
442
|
{
|
|
457
443
|
as: "label",
|
|
458
|
-
className:
|
|
459
|
-
"w-8 cursor-pointer justify-center overflow-visible px-0 py-0!",
|
|
460
|
-
checked === false && dataListTopRevealStyles
|
|
461
|
-
),
|
|
444
|
+
className: "w-8 cursor-pointer justify-center overflow-visible px-0 py-0!",
|
|
462
445
|
onClick: (e) => e.stopPropagation(),
|
|
463
446
|
children: /* @__PURE__ */ jsx(Checkbox, { checked, onCheckedChange: () => onToggle(), "aria-label": rest["aria-label"] })
|
|
464
447
|
}
|
|
465
448
|
);
|
|
466
449
|
}
|
|
467
450
|
|
|
468
|
-
export {
|
|
469
|
-
//# sourceMappingURL=data-list-top-cell-
|
|
451
|
+
export { DataListRoot as D, DataListTop as a, DataListTopCell as b, DataListCell as c, dataListRowOuterStyles as d, DataListTextCell as e, DataListNextPageLoading as f, DataListTimeCell as g, DataListDateCell as h, DataListNoMatch as i, DataListSpacer as j, DataListRowLink as k, DataListRowButton as l, DataListRowWrapper as m, DataListTopCellSmart as n, DataListTopCellWithTooltip as o, DataListCreatedCell as p, DataListIdCell 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 };
|
|
452
|
+
//# sourceMappingURL=data-list-top-cell-D4-Hbz2H.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-list-top-cell-D4-Hbz2H.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 bg-surface2',\n 'transition-colors duration-200',\n] as const;\n\n/**\n * Interactive state fills for the outer row element. Applied to standalone\n * `RowButton` / `RowLink` and to `RowWrapper`. The `has-*` forms let a wrapper\n * mirror the tone of the interactive row nested inside it.\n */\nexport const dataListRowStateStyles = [\n 'hover:bg-surface3 active:bg-surface4',\n 'data-featured:bg-surface3 has-data-featured:bg-surface3 has-data-selected:bg-surface3',\n 'data-featured:hover:bg-surface4 has-data-featured:hover:bg-surface4 has-data-selected:hover:bg-surface4',\n 'data-[variant=error]:bg-notice-destructive/10 has-data-[variant=error]:bg-notice-destructive/10',\n] as const;\n\n/**\n * Layout and focus for the interactive element. The background lives on the\n * outer row element so it sits inside the root surface.\n */\nexport const dataListRowInteractiveStyles = [\n 'grid grid-cols-subgrid gap-8 px-5 cursor-pointer',\n 'outline-none focus-visible:ring-1 focus-visible:ring-inset focus-visible:ring-accent1',\n] as const;\n\nexport const dataListRowStyles = [\n ...dataListRowInteractiveStyles,\n ...dataListRowOuterStyles,\n ...dataListRowStateStyles,\n] as const;\n\nexport const dataListRowStaticStyles = ['grid grid-cols-subgrid gap-8 px-5', ...dataListRowOuterStyles] as const;\n\n/**\n * Row actions 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 dataListRowActionRevealStyles =\n 'opacity-0 pointer-coarse:opacity-100 group-focus-within/data-list-row:opacity-100 group-hover/data-list-row:opacity-100';\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] as const;\n\n/** Tone for a single row. Exposed as `data-variant`; `error` tints the row. */\nexport type DataListRowVariant = 'default' | 'error';\n\n/**\n * Layout/state modifiers shared by interactive row primitives\n * (`DataList.RowButton`, `DataList.RowLink`).\n */\nexport type DataListRowSharedProps = {\n /** Row tone — exposed on the element as `data-variant`. */\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 * Mark the row as featured (e.g. the row whose detail is open in a side\n * panel). Exposed on the element as `data-featured` and tints the row.\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 { dataListRowActionRevealStyles, 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 dataListRowActionRevealStyles,\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 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 disabled ? 'cursor-not-allowed' : 'cursor-pointer',\n )}\n onClick={e => e.stopPropagation()}\n data-selected={checked || undefined}\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 DataListCreatedCellProps {\n timestamp: Date | string;\n}\n\n/** Combined date + time cell — `MMM dd h:mm:ss a` (e.g. `Aug 31 1:07:47 pm`), no milliseconds. */\nexport function DataListCreatedCell({ timestamp }: DataListCreatedCellProps) {\n const date = toDate(timestamp);\n return (\n <DataListCell className=\"text-ui-smd text-neutral3 tabular-nums\">\n {date ? format(date, 'MMM dd h:mm:ss aaa') : 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 // Zero-height when idle so it adds no trailing space below the last row;\n // IntersectionObserver still fires for a zero-area target at the viewport edge.\n className={cn('col-span-full -mt-px flex justify-center text-ui-md text-neutral3 opacity-50', {\n 'py-4': isLoading,\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(\n 'col-span-full flex flex-col items-center justify-center gap-2 rounded-lg bg-surface2 py-12 text-neutral3',\n className,\n )}\n {...props}\n >\n <p className=\"text-ui-md\">{message}</p>\n </div>\n );\n}\n","import 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 * 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';\n\n/**\n * Surface treatment of the list.\n *\n * - `default`: rows sit on a rounded `surface4` panel.\n * - `light`: no panel behind the rows; rows sit directly on the page.\n */\nexport type DataListVariant = 'default' | 'light';\n\nexport type DataListRootProps = Omit<ScrollAreaProps, 'children' | 'orientation' | 'mask' | 'viewportRef'> & {\n children: ReactNode;\n columns: string;\n /** Grid width behavior; defaults to `content` (existing horizontal-scroll sizing). */\n fit?: DataListFit;\n /** Surface treatment; defaults to `default` (rows on a `surface4` panel). */\n variant?: DataListVariant;\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\ntype DataListRootStyle = CSSProperties & {\n '--data-list-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 * The root owns the unified table treatment so standalone and wrapped rows look\n * identical without requiring a per-row index. The ScrollArea provides the\n * fixed frame; this grid paints the sticky header and separators. The root is\n * the only element that defines a color: sticky parts read the background\n * through `--data-list-background` so they stay opaque while scrolling, and\n * rows/header draw no separators, borders or rings of their own.\n */\nconst dataListGridStyles = [\n 'gap-y-px',\n // Rows are siblings of the header, so first/last are found via sibling combinators.\n '[&_.data-list-row:not(.data-list-row~.data-list-row)]:rounded-t-lg',\n '[&_.data-list-row:not(:has(~.data-list-row))]:rounded-b-lg',\n '[&_.data-list-row:not(.data-list-row~.data-list-row)>.data-list-sticky-start]:rounded-tl-lg',\n '[&_.data-list-row:not(:has(~.data-list-row))>.data-list-sticky-start]:rounded-bl-lg',\n // Subheaders split the rows into sections; each section gets its own rounded ends.\n '[&_.data-list-subheader+.data-list-row]:rounded-t-lg',\n '[&_.data-list-row:has(+.data-list-subheader)]:rounded-b-lg',\n '[&_.data-list-subheader+.data-list-row>.data-list-sticky-start]:rounded-tl-lg',\n '[&_.data-list-row:has(+.data-list-subheader)>.data-list-sticky-start]:rounded-bl-lg',\n '[&_.data-list-top]:bg-(--data-list-background)',\n '[&_.data-list-row>.data-list-sticky-start]:bg-surface2',\n '[&_.data-list-row>.data-list-sticky-start]:after:right-0',\n '[&_.data-list-top>.data-list-sticky-start]:after:right-0',\n] as const;\n\nconst dataListVariantClasses: Record<DataListVariant, string> = {\n default: 'bg-surface4',\n light: '',\n};\n\n// The sticky header reads this so it stays opaque while scrolling: the panel\n// color by default, the page surface when there is no panel.\nconst dataListVariantBackground: Record<DataListVariant, string> = {\n default: 'var(--surface4)',\n light: 'var(--surface1)',\n};\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\nexport function DataListRoot({\n children,\n columns,\n className,\n fit = 'content',\n variant = 'default',\n mask,\n scrollRef,\n ...props\n}: DataListRootProps) {\n const gridStyle: DataListRootStyle = {\n '--data-list-background': dataListVariantBackground[variant],\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('grid content-start', ...dataListGridStyles, 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 // Outer radius = row radius (8px) + 4px inset so the corners stay concentric.\n // Size to content but never exceed the parent. Flex (unlike grid `1fr`) lays\n // items out against the max-height-clamped container, so short lists stay\n // compact and long ones shrink the viewport and scroll. `self-start` stops\n // a grid/flex parent from stretching the root to the full row height.\n viewPortClassName=\"min-h-0 flex-1 basis-auto\"\n className={cn(\n 'flex max-h-full w-full flex-col self-start rounded-xl px-1 pb-1',\n dataListVariantClasses[variant],\n className,\n )}\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 } 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(...(isWrapped ? dataListRowInteractiveStyles : dataListRowStyles), 'text-left', className)}\n style={resolvedStyle}\n data-featured={featured || undefined}\n data-variant={variant ?? 'default'}\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 } 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(...(isWrapped ? dataListRowInteractiveStyles : dataListRowStyles), className)}\n style={resolvedStyle}\n data-featured={featured || undefined}\n data-variant={variant ?? 'default'}\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, dataListRowStateStyles } 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\n ref={ref}\n className={cn(\n 'grid grid-cols-subgrid gap-0',\n ...dataListRowOuterStyles,\n ...dataListRowStateStyles,\n className,\n )}\n {...rest}\n >\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 } 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 pr-4 pl-5',\n sticky === 'start' && 'z-20',\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=\"w-8 cursor-pointer justify-center overflow-visible px-0 py-0!\"\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-BZR_Hkvj.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-PExVAYf3.cjs');
|
|
11
11
|
|
|
12
12
|
const COLUMNS = "6rem 9rem 5rem 10rem minmax(8rem,1fr) minmax(8rem,1fr)";
|
|
13
13
|
const ROW_HEIGHT = 36;
|
|
@@ -48,7 +48,7 @@ function LogsListView({
|
|
|
48
48
|
const totalSize = virtualizer.getTotalSize();
|
|
49
49
|
const paddingTop = virtualItems[0]?.start ?? 0;
|
|
50
50
|
const paddingBottom = virtualItems.length > 0 ? Math.max(0, totalSize - (virtualItems[virtualItems.length - 1]?.end ?? 0)) : 0;
|
|
51
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(logsDataList.LogsDataList, { columns: COLUMNS,
|
|
51
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(logsDataList.LogsDataList, { columns: COLUMNS, scrollRef, className: "min-w-0", children: [
|
|
52
52
|
/* @__PURE__ */ jsxRuntime.jsxs(logsDataList.LogsDataList.Top, { children: [
|
|
53
53
|
/* @__PURE__ */ jsxRuntime.jsx(logsDataList.LogsDataList.TopCell, { children: "Date" }),
|
|
54
54
|
/* @__PURE__ */ jsxRuntime.jsx(logsDataList.LogsDataList.TopCell, { children: "Time" }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logs-list-view.cjs.js","sources":["../../../../src/domains/logs/components/logs-list-view.tsx"],"sourcesContent":["import { useVirtualizer } from '@tanstack/react-virtual';\nimport { useEffect, useRef } from 'react';\nimport type { LogRecord } from '../types';\nimport { useDataListKeyboard } from '@/ds/components/DataList';\nimport { LogsDataList, LogsDataListSkeleton } from '@/ds/components/LogsDataList';\n\n// Fixed widths on non-flex columns prevent track shifts as the virtualizer swaps rows in/out.\nconst COLUMNS = '6rem 9rem 5rem 10rem minmax(8rem,1fr) minmax(8rem,1fr)';\n\nconst ROW_HEIGHT = 36;\nconst OVERSCAN = 8;\n\nexport interface LogsListViewProps {\n logs: LogRecord[];\n isLoading?: boolean;\n isFetchingNextPage?: boolean;\n hasNextPage?: boolean;\n setEndOfListElement?: (element: HTMLDivElement | null) => void;\n /** Stable per-render id for each log — used for React keys and for matching against `featuredLogId`.\n * Build with `useLogsListNavigation`. */\n logIdMap: Map<LogRecord, string>;\n /** Currently featured/selected log — its row gets the highlighted background. */\n featuredLogId?: string | null;\n /** Called when a row is clicked. The current toggle + trace-sync logic is the consumer's call. */\n onLogClick: (log: LogRecord) => void;\n}\n\n/**\n * Virtualized presentational list. Renders only the visible window of logs via\n * TanStack Virtual, sandwiched between top/bottom Spacers that preserve total\n * scroll height. Owns no state and fetches no data.\n */\nexport function LogsListView({\n logs,\n isLoading,\n isFetchingNextPage,\n hasNextPage,\n setEndOfListElement,\n logIdMap,\n featuredLogId,\n onLogClick,\n}: LogsListViewProps) {\n const scrollRef = useRef<HTMLDivElement | null>(null);\n\n const virtualizer = useVirtualizer({\n count: logs.length,\n getScrollElement: () => scrollRef.current,\n estimateSize: () => ROW_HEIGHT,\n overscan: OVERSCAN,\n });\n\n const { getRowProps } = useDataListKeyboard({\n count: logs.length,\n containerRef: scrollRef,\n onNavigate: index => virtualizer.scrollToIndex(index),\n });\n\n // Reset scroll to top whenever a fresh query resolves (filter / date range change).\n // `isLoading` only flips on initial fetches — `fetchNextPage` keeps it `false`, so this\n // effect doesn't fire during pagination.\n //\n // Why the manual scroll event: when the skeleton-vs-list branch swaps in the new scroll\n // container, it mounts at `scrollTop = 0`. The virtualizer rebinds its listener but\n // doesn't re-read `scrollTop`, so it keeps the stale `scrollOffset` from the previous\n // element. `scrollToOffset(0)` no-ops because the new element is already at 0 (no scroll\n // event fires). Dispatching a synthetic `scroll` forces the virtualizer's handler to\n // read the fresh `scrollTop` and recompute `virtualItems` with `paddingTop = 0`.\n const wasLoadingRef = useRef(isLoading);\n useEffect(() => {\n if (wasLoadingRef.current && !isLoading) {\n scrollRef.current?.dispatchEvent(new Event('scroll'));\n }\n wasLoadingRef.current = isLoading;\n }, [isLoading]);\n\n if (isLoading) {\n return <LogsDataListSkeleton columns={COLUMNS} />;\n }\n\n const virtualItems = virtualizer.getVirtualItems();\n const totalSize = virtualizer.getTotalSize();\n const paddingTop = virtualItems[0]?.start ?? 0;\n const paddingBottom =\n virtualItems.length > 0 ? Math.max(0, totalSize - (virtualItems[virtualItems.length - 1]?.end ?? 0)) : 0;\n\n return (\n <LogsDataList columns={COLUMNS}
|
|
1
|
+
{"version":3,"file":"logs-list-view.cjs.js","sources":["../../../../src/domains/logs/components/logs-list-view.tsx"],"sourcesContent":["import { useVirtualizer } from '@tanstack/react-virtual';\nimport { useEffect, useRef } from 'react';\nimport type { LogRecord } from '../types';\nimport { useDataListKeyboard } from '@/ds/components/DataList';\nimport { LogsDataList, LogsDataListSkeleton } from '@/ds/components/LogsDataList';\n\n// Fixed widths on non-flex columns prevent track shifts as the virtualizer swaps rows in/out.\nconst COLUMNS = '6rem 9rem 5rem 10rem minmax(8rem,1fr) minmax(8rem,1fr)';\n\nconst ROW_HEIGHT = 36;\nconst OVERSCAN = 8;\n\nexport interface LogsListViewProps {\n logs: LogRecord[];\n isLoading?: boolean;\n isFetchingNextPage?: boolean;\n hasNextPage?: boolean;\n setEndOfListElement?: (element: HTMLDivElement | null) => void;\n /** Stable per-render id for each log — used for React keys and for matching against `featuredLogId`.\n * Build with `useLogsListNavigation`. */\n logIdMap: Map<LogRecord, string>;\n /** Currently featured/selected log — its row gets the highlighted background. */\n featuredLogId?: string | null;\n /** Called when a row is clicked. The current toggle + trace-sync logic is the consumer's call. */\n onLogClick: (log: LogRecord) => void;\n}\n\n/**\n * Virtualized presentational list. Renders only the visible window of logs via\n * TanStack Virtual, sandwiched between top/bottom Spacers that preserve total\n * scroll height. Owns no state and fetches no data.\n */\nexport function LogsListView({\n logs,\n isLoading,\n isFetchingNextPage,\n hasNextPage,\n setEndOfListElement,\n logIdMap,\n featuredLogId,\n onLogClick,\n}: LogsListViewProps) {\n const scrollRef = useRef<HTMLDivElement | null>(null);\n\n const virtualizer = useVirtualizer({\n count: logs.length,\n getScrollElement: () => scrollRef.current,\n estimateSize: () => ROW_HEIGHT,\n overscan: OVERSCAN,\n });\n\n const { getRowProps } = useDataListKeyboard({\n count: logs.length,\n containerRef: scrollRef,\n onNavigate: index => virtualizer.scrollToIndex(index),\n });\n\n // Reset scroll to top whenever a fresh query resolves (filter / date range change).\n // `isLoading` only flips on initial fetches — `fetchNextPage` keeps it `false`, so this\n // effect doesn't fire during pagination.\n //\n // Why the manual scroll event: when the skeleton-vs-list branch swaps in the new scroll\n // container, it mounts at `scrollTop = 0`. The virtualizer rebinds its listener but\n // doesn't re-read `scrollTop`, so it keeps the stale `scrollOffset` from the previous\n // element. `scrollToOffset(0)` no-ops because the new element is already at 0 (no scroll\n // event fires). Dispatching a synthetic `scroll` forces the virtualizer's handler to\n // read the fresh `scrollTop` and recompute `virtualItems` with `paddingTop = 0`.\n const wasLoadingRef = useRef(isLoading);\n useEffect(() => {\n if (wasLoadingRef.current && !isLoading) {\n scrollRef.current?.dispatchEvent(new Event('scroll'));\n }\n wasLoadingRef.current = isLoading;\n }, [isLoading]);\n\n if (isLoading) {\n return <LogsDataListSkeleton columns={COLUMNS} />;\n }\n\n const virtualItems = virtualizer.getVirtualItems();\n const totalSize = virtualizer.getTotalSize();\n const paddingTop = virtualItems[0]?.start ?? 0;\n const paddingBottom =\n virtualItems.length > 0 ? Math.max(0, totalSize - (virtualItems[virtualItems.length - 1]?.end ?? 0)) : 0;\n\n return (\n <LogsDataList columns={COLUMNS} scrollRef={scrollRef} className=\"min-w-0\">\n <LogsDataList.Top>\n <LogsDataList.TopCell>Date</LogsDataList.TopCell>\n <LogsDataList.TopCell>Time</LogsDataList.TopCell>\n <LogsDataList.TopCell>Level</LogsDataList.TopCell>\n <LogsDataList.TopCell>Entity</LogsDataList.TopCell>\n <LogsDataList.TopCell>Message</LogsDataList.TopCell>\n <LogsDataList.TopCell>Data</LogsDataList.TopCell>\n </LogsDataList.Top>\n\n {logs.length === 0 ? (\n <LogsDataList.NoMatch message=\"No logs match your search\" />\n ) : (\n <>\n <LogsDataList.Spacer height={paddingTop} />\n {virtualItems.map(vi => {\n const log = logs[vi.index];\n if (!log) return null;\n const id = logIdMap.get(log);\n // Defensive: consumer is expected to build `logIdMap` from the same `logs` list\n // (via `useLogsListNavigation`), but if they drift we'd rather drop the row than\n // ship a missing-key warning and broken selection highlighting.\n if (!id) return null;\n const isFeatured = id === featuredLogId;\n\n return (\n <LogsDataList.RowButton\n key={id}\n ref={virtualizer.measureElement}\n data-index={vi.index}\n {...getRowProps(vi.index)}\n onClick={() => onLogClick(log)}\n featured={isFeatured}\n variant={log.level === 'error' || log.level === 'fatal' ? 'error' : 'default'}\n >\n <LogsDataList.DateCell timestamp={log.timestamp} />\n <LogsDataList.TimeCell timestamp={log.timestamp} />\n <LogsDataList.LevelCell level={log.level} />\n <LogsDataList.EntityCell entityType={log.entityType} entityName={log.entityName} />\n <LogsDataList.MessageCell message={log.message} />\n <LogsDataList.DataCell data={log.data} />\n </LogsDataList.RowButton>\n );\n })}\n <LogsDataList.Spacer height={paddingBottom} />\n </>\n )}\n <LogsDataList.NextPageLoading\n isLoading={isFetchingNextPage}\n hasMore={hasNextPage}\n setEndOfListElement={setEndOfListElement}\n />\n </LogsDataList>\n );\n}\n"],"names":["useRef","useVirtualizer","useDataListKeyboard","useEffect","jsx","LogsDataListSkeleton","LogsDataList","jsxs","Fragment"],"mappings":"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"}
|
|
@@ -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-BoaQlbOY.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-VCTqogr3.js';
|
|
7
7
|
|
|
8
8
|
const COLUMNS = "6rem 9rem 5rem 10rem minmax(8rem,1fr) minmax(8rem,1fr)";
|
|
9
9
|
const ROW_HEIGHT = 36;
|
|
@@ -44,7 +44,7 @@ function LogsListView({
|
|
|
44
44
|
const totalSize = virtualizer.getTotalSize();
|
|
45
45
|
const paddingTop = virtualItems[0]?.start ?? 0;
|
|
46
46
|
const paddingBottom = virtualItems.length > 0 ? Math.max(0, totalSize - (virtualItems[virtualItems.length - 1]?.end ?? 0)) : 0;
|
|
47
|
-
return /* @__PURE__ */ jsxs(LogsDataList, { columns: COLUMNS,
|
|
47
|
+
return /* @__PURE__ */ jsxs(LogsDataList, { columns: COLUMNS, scrollRef, className: "min-w-0", children: [
|
|
48
48
|
/* @__PURE__ */ jsxs(LogsDataList.Top, { children: [
|
|
49
49
|
/* @__PURE__ */ jsx(LogsDataList.TopCell, { children: "Date" }),
|
|
50
50
|
/* @__PURE__ */ jsx(LogsDataList.TopCell, { children: "Time" }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logs-list-view.es.js","sources":["../../../../src/domains/logs/components/logs-list-view.tsx"],"sourcesContent":["import { useVirtualizer } from '@tanstack/react-virtual';\nimport { useEffect, useRef } from 'react';\nimport type { LogRecord } from '../types';\nimport { useDataListKeyboard } from '@/ds/components/DataList';\nimport { LogsDataList, LogsDataListSkeleton } from '@/ds/components/LogsDataList';\n\n// Fixed widths on non-flex columns prevent track shifts as the virtualizer swaps rows in/out.\nconst COLUMNS = '6rem 9rem 5rem 10rem minmax(8rem,1fr) minmax(8rem,1fr)';\n\nconst ROW_HEIGHT = 36;\nconst OVERSCAN = 8;\n\nexport interface LogsListViewProps {\n logs: LogRecord[];\n isLoading?: boolean;\n isFetchingNextPage?: boolean;\n hasNextPage?: boolean;\n setEndOfListElement?: (element: HTMLDivElement | null) => void;\n /** Stable per-render id for each log — used for React keys and for matching against `featuredLogId`.\n * Build with `useLogsListNavigation`. */\n logIdMap: Map<LogRecord, string>;\n /** Currently featured/selected log — its row gets the highlighted background. */\n featuredLogId?: string | null;\n /** Called when a row is clicked. The current toggle + trace-sync logic is the consumer's call. */\n onLogClick: (log: LogRecord) => void;\n}\n\n/**\n * Virtualized presentational list. Renders only the visible window of logs via\n * TanStack Virtual, sandwiched between top/bottom Spacers that preserve total\n * scroll height. Owns no state and fetches no data.\n */\nexport function LogsListView({\n logs,\n isLoading,\n isFetchingNextPage,\n hasNextPage,\n setEndOfListElement,\n logIdMap,\n featuredLogId,\n onLogClick,\n}: LogsListViewProps) {\n const scrollRef = useRef<HTMLDivElement | null>(null);\n\n const virtualizer = useVirtualizer({\n count: logs.length,\n getScrollElement: () => scrollRef.current,\n estimateSize: () => ROW_HEIGHT,\n overscan: OVERSCAN,\n });\n\n const { getRowProps } = useDataListKeyboard({\n count: logs.length,\n containerRef: scrollRef,\n onNavigate: index => virtualizer.scrollToIndex(index),\n });\n\n // Reset scroll to top whenever a fresh query resolves (filter / date range change).\n // `isLoading` only flips on initial fetches — `fetchNextPage` keeps it `false`, so this\n // effect doesn't fire during pagination.\n //\n // Why the manual scroll event: when the skeleton-vs-list branch swaps in the new scroll\n // container, it mounts at `scrollTop = 0`. The virtualizer rebinds its listener but\n // doesn't re-read `scrollTop`, so it keeps the stale `scrollOffset` from the previous\n // element. `scrollToOffset(0)` no-ops because the new element is already at 0 (no scroll\n // event fires). Dispatching a synthetic `scroll` forces the virtualizer's handler to\n // read the fresh `scrollTop` and recompute `virtualItems` with `paddingTop = 0`.\n const wasLoadingRef = useRef(isLoading);\n useEffect(() => {\n if (wasLoadingRef.current && !isLoading) {\n scrollRef.current?.dispatchEvent(new Event('scroll'));\n }\n wasLoadingRef.current = isLoading;\n }, [isLoading]);\n\n if (isLoading) {\n return <LogsDataListSkeleton columns={COLUMNS} />;\n }\n\n const virtualItems = virtualizer.getVirtualItems();\n const totalSize = virtualizer.getTotalSize();\n const paddingTop = virtualItems[0]?.start ?? 0;\n const paddingBottom =\n virtualItems.length > 0 ? Math.max(0, totalSize - (virtualItems[virtualItems.length - 1]?.end ?? 0)) : 0;\n\n return (\n <LogsDataList columns={COLUMNS}
|
|
1
|
+
{"version":3,"file":"logs-list-view.es.js","sources":["../../../../src/domains/logs/components/logs-list-view.tsx"],"sourcesContent":["import { useVirtualizer } from '@tanstack/react-virtual';\nimport { useEffect, useRef } from 'react';\nimport type { LogRecord } from '../types';\nimport { useDataListKeyboard } from '@/ds/components/DataList';\nimport { LogsDataList, LogsDataListSkeleton } from '@/ds/components/LogsDataList';\n\n// Fixed widths on non-flex columns prevent track shifts as the virtualizer swaps rows in/out.\nconst COLUMNS = '6rem 9rem 5rem 10rem minmax(8rem,1fr) minmax(8rem,1fr)';\n\nconst ROW_HEIGHT = 36;\nconst OVERSCAN = 8;\n\nexport interface LogsListViewProps {\n logs: LogRecord[];\n isLoading?: boolean;\n isFetchingNextPage?: boolean;\n hasNextPage?: boolean;\n setEndOfListElement?: (element: HTMLDivElement | null) => void;\n /** Stable per-render id for each log — used for React keys and for matching against `featuredLogId`.\n * Build with `useLogsListNavigation`. */\n logIdMap: Map<LogRecord, string>;\n /** Currently featured/selected log — its row gets the highlighted background. */\n featuredLogId?: string | null;\n /** Called when a row is clicked. The current toggle + trace-sync logic is the consumer's call. */\n onLogClick: (log: LogRecord) => void;\n}\n\n/**\n * Virtualized presentational list. Renders only the visible window of logs via\n * TanStack Virtual, sandwiched between top/bottom Spacers that preserve total\n * scroll height. Owns no state and fetches no data.\n */\nexport function LogsListView({\n logs,\n isLoading,\n isFetchingNextPage,\n hasNextPage,\n setEndOfListElement,\n logIdMap,\n featuredLogId,\n onLogClick,\n}: LogsListViewProps) {\n const scrollRef = useRef<HTMLDivElement | null>(null);\n\n const virtualizer = useVirtualizer({\n count: logs.length,\n getScrollElement: () => scrollRef.current,\n estimateSize: () => ROW_HEIGHT,\n overscan: OVERSCAN,\n });\n\n const { getRowProps } = useDataListKeyboard({\n count: logs.length,\n containerRef: scrollRef,\n onNavigate: index => virtualizer.scrollToIndex(index),\n });\n\n // Reset scroll to top whenever a fresh query resolves (filter / date range change).\n // `isLoading` only flips on initial fetches — `fetchNextPage` keeps it `false`, so this\n // effect doesn't fire during pagination.\n //\n // Why the manual scroll event: when the skeleton-vs-list branch swaps in the new scroll\n // container, it mounts at `scrollTop = 0`. The virtualizer rebinds its listener but\n // doesn't re-read `scrollTop`, so it keeps the stale `scrollOffset` from the previous\n // element. `scrollToOffset(0)` no-ops because the new element is already at 0 (no scroll\n // event fires). Dispatching a synthetic `scroll` forces the virtualizer's handler to\n // read the fresh `scrollTop` and recompute `virtualItems` with `paddingTop = 0`.\n const wasLoadingRef = useRef(isLoading);\n useEffect(() => {\n if (wasLoadingRef.current && !isLoading) {\n scrollRef.current?.dispatchEvent(new Event('scroll'));\n }\n wasLoadingRef.current = isLoading;\n }, [isLoading]);\n\n if (isLoading) {\n return <LogsDataListSkeleton columns={COLUMNS} />;\n }\n\n const virtualItems = virtualizer.getVirtualItems();\n const totalSize = virtualizer.getTotalSize();\n const paddingTop = virtualItems[0]?.start ?? 0;\n const paddingBottom =\n virtualItems.length > 0 ? Math.max(0, totalSize - (virtualItems[virtualItems.length - 1]?.end ?? 0)) : 0;\n\n return (\n <LogsDataList columns={COLUMNS} scrollRef={scrollRef} className=\"min-w-0\">\n <LogsDataList.Top>\n <LogsDataList.TopCell>Date</LogsDataList.TopCell>\n <LogsDataList.TopCell>Time</LogsDataList.TopCell>\n <LogsDataList.TopCell>Level</LogsDataList.TopCell>\n <LogsDataList.TopCell>Entity</LogsDataList.TopCell>\n <LogsDataList.TopCell>Message</LogsDataList.TopCell>\n <LogsDataList.TopCell>Data</LogsDataList.TopCell>\n </LogsDataList.Top>\n\n {logs.length === 0 ? (\n <LogsDataList.NoMatch message=\"No logs match your search\" />\n ) : (\n <>\n <LogsDataList.Spacer height={paddingTop} />\n {virtualItems.map(vi => {\n const log = logs[vi.index];\n if (!log) return null;\n const id = logIdMap.get(log);\n // Defensive: consumer is expected to build `logIdMap` from the same `logs` list\n // (via `useLogsListNavigation`), but if they drift we'd rather drop the row than\n // ship a missing-key warning and broken selection highlighting.\n if (!id) return null;\n const isFeatured = id === featuredLogId;\n\n return (\n <LogsDataList.RowButton\n key={id}\n ref={virtualizer.measureElement}\n data-index={vi.index}\n {...getRowProps(vi.index)}\n onClick={() => onLogClick(log)}\n featured={isFeatured}\n variant={log.level === 'error' || log.level === 'fatal' ? 'error' : 'default'}\n >\n <LogsDataList.DateCell timestamp={log.timestamp} />\n <LogsDataList.TimeCell timestamp={log.timestamp} />\n <LogsDataList.LevelCell level={log.level} />\n <LogsDataList.EntityCell entityType={log.entityType} entityName={log.entityName} />\n <LogsDataList.MessageCell message={log.message} />\n <LogsDataList.DataCell data={log.data} />\n </LogsDataList.RowButton>\n );\n })}\n <LogsDataList.Spacer height={paddingBottom} />\n </>\n )}\n <LogsDataList.NextPageLoading\n isLoading={isFetchingNextPage}\n hasMore={hasNextPage}\n setEndOfListElement={setEndOfListElement}\n />\n </LogsDataList>\n );\n}\n"],"names":["LogsDataListSkeleton"],"mappings":"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"}
|
|
@@ -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-B5Wicaoc.cjs');
|
|
8
8
|
const metricsCard = require('../../../metrics-card-B8zgHlgB.cjs');
|
|
9
9
|
const tabsContent = require('../../../tabs-content-BxToGCDw.cjs');
|
|
10
10
|
const tabsRoot = require('../../../tabs-root-BNcLC-s6.cjs');
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
2
2
|
import { useState } from 'react';
|
|
3
|
-
import { D as DataList } from '../../../data-list-
|
|
3
|
+
import { D as DataList } from '../../../data-list-BUK_v9ax.js';
|
|
4
4
|
import { M as MetricsCard } from '../../../metrics-card-BKE1UzWh.js';
|
|
5
5
|
import { T as TabContent } from '../../../tabs-content-CLgmU6S_.js';
|
|
6
6
|
import { a as Tabs, T as TabList } from '../../../tabs-root-BnwVjJbD.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics-utils.cjs.js","sources":["../../../../src/domains/metrics/components/metrics-utils.ts"],"sourcesContent":["import type { DataListRootProps } from '@/ds/components/DataList';\n\nexport function formatCompact(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(1)}K`;\n return n.toLocaleString();\n}\n\nexport function formatCost(value: number, unit?: string | null): string {\n if (unit?.toLowerCase() === 'usd' || !unit) {\n return `$${value < 0.01 && value > 0 ? value.toFixed(4) : value.toFixed(2)}`;\n }\n return `${value.toFixed(4)} ${unit}`;\n}\n\nexport const METRICS_DATA_LIST_PROPS = {\n className: 'max-h-80',\n mask: { left: false },\n
|
|
1
|
+
{"version":3,"file":"metrics-utils.cjs.js","sources":["../../../../src/domains/metrics/components/metrics-utils.ts"],"sourcesContent":["import type { DataListRootProps } from '@/ds/components/DataList';\n\nexport function formatCompact(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(1)}K`;\n return n.toLocaleString();\n}\n\nexport function formatCost(value: number, unit?: string | null): string {\n if (unit?.toLowerCase() === 'usd' || !unit) {\n return `$${value < 0.01 && value > 0 ? value.toFixed(4) : value.toFixed(2)}`;\n }\n return `${value.toFixed(4)} ${unit}`;\n}\n\nexport const METRICS_DATA_LIST_PROPS = {\n className: 'max-h-80',\n mask: { left: false },\n} satisfies Pick<DataListRootProps, 'className' | 'mask'>;\n\nexport const CHART_COLORS = {\n green: '#22c55e',\n orange: '#fb923c',\n pink: '#f472b6',\n purple: '#8b5cf6',\n blue: '#4f83f1',\n blueDark: '#2b5cd9',\n blueLight: '#6b8fe5',\n red: '#f87171',\n greenDark: '#15613a',\n redDark: '#991b1b',\n yellow: '#facc15',\n} as const;\n"],"names":[],"mappings":";;;;AAEO,SAAS,cAAc,CAAA,EAAmB;AAC/C,EAAA,IAAI,CAAA,IAAK,KAAW,OAAO,CAAA,EAAA,CAAI,IAAI,GAAA,EAAW,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AACxD,EAAA,IAAI,CAAA,IAAK,KAAO,OAAO,CAAA,EAAA,CAAI,IAAI,GAAA,EAAO,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAChD,EAAA,OAAO,EAAE,cAAA,EAAe;AAC1B;AAEO,SAAS,UAAA,CAAW,OAAe,IAAA,EAA8B;AACtE,EAAA,IAAI,IAAA,EAAM,WAAA,EAAY,KAAM,KAAA,IAAS,CAAC,IAAA,EAAM;AAC1C,IAAA,OAAO,CAAA,CAAA,EAAI,KAAA,GAAQ,IAAA,IAAQ,KAAA,GAAQ,CAAA,GAAI,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,GAAI,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA;AAAA,EAC5E;AACA,EAAA,OAAO,GAAG,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,IAAI,IAAI,CAAA,CAAA;AACpC;AAEO,MAAM,uBAAA,GAA0B;AAAA,EACrC,SAAA,EAAW,UAAA;AAAA,EACX,IAAA,EAAM,EAAE,IAAA,EAAM,KAAA;AAChB;AAEO,MAAM,YAAA,GAAe;AAAA,EAC1B,KAAA,EAAO,SAAA;AAAA,EACP,MAAA,EAAQ,SAAA;AAAA,EACR,IAAA,EAAM,SAAA;AAAA,EACN,MAAA,EAAQ,SAAA;AAAA,EACR,IAAA,EAAM,SAAA;AAAA,EACN,QAAA,EAAU,SAAA;AAAA,EACV,SAAA,EAAW,SAAA;AAAA,EACX,GAAA,EAAK,SAAA;AAAA,EACL,SAAA,EAAW,SAAA;AAAA,EACX,OAAA,EAAS,SAAA;AAAA,EACT,MAAA,EAAQ;AACV;;;;;;;"}
|