@mastra/playground-ui 26.1.0-alpha.0 → 26.1.0-alpha.2

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 CHANGED
@@ -1,5 +1,27 @@
1
1
  # @mastra/playground-ui
2
2
 
3
+ ## 26.1.0-alpha.2
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [[`d1fdbd0`](https://github.com/mastra-ai/mastra/commit/d1fdbd012add5623cb7e6b7f882b605ab358bbb4), [`d91ebe2`](https://github.com/mastra-ai/mastra/commit/d91ebe28ee065d8f2ed6df741c3c07f58d359529), [`e41e7c8`](https://github.com/mastra-ai/mastra/commit/e41e7c88285feefe5cddea22105b40092bcf217f)]:
8
+ - @mastra/core@1.33.0-alpha.2
9
+ - @mastra/client-js@1.17.2-alpha.2
10
+ - @mastra/react@0.2.36-alpha.2
11
+
12
+ ## 26.1.0-alpha.1
13
+
14
+ ### Patch Changes
15
+
16
+ - Improved Studio's Traces page to scale smoothly to many traces. The list now renders only the visible window, so scrolling stays responsive and memory usage stays bounded regardless of how many traces are loaded. ([#16262](https://github.com/mastra-ai/mastra/pull/16262))
17
+
18
+ - Improved Studio's Logs page to scale smoothly to many log records. The list now renders only the visible window, so scrolling stays responsive and memory usage stays bounded regardless of how many logs are loaded. ([#16263](https://github.com/mastra-ai/mastra/pull/16263))
19
+
20
+ - Updated dependencies [[`dccd8f1`](https://github.com/mastra-ai/mastra/commit/dccd8f1f8b8f1ad203b77556207e5529567c616d)]:
21
+ - @mastra/core@1.33.0-alpha.1
22
+ - @mastra/client-js@1.17.2-alpha.1
23
+ - @mastra/react@0.2.36-alpha.1
24
+
3
25
  ## 26.1.0-alpha.0
4
26
 
5
27
  ### Minor Changes
package/dist/index.cjs.js CHANGED
@@ -52,6 +52,7 @@ const reactResizablePanels = require('react-resizable-panels');
52
52
  const zustand = require('zustand');
53
53
  const middleware = require('zustand/middleware');
54
54
  const reactQuery = require('@tanstack/react-query');
55
+ const reactVirtual = require('@tanstack/react-virtual');
55
56
  const observability = require('@mastra/core/observability');
56
57
 
57
58
  function _interopNamespaceDefault(e) {
@@ -12502,10 +12503,11 @@ function DataListPagination({ currentPage, hasMore, onNextPage, onPrevPage }) {
12502
12503
  ] });
12503
12504
  }
12504
12505
 
12505
- function DataListRoot({ children, columns, className }) {
12506
+ function DataListRoot({ children, columns, className, scrollRef }) {
12506
12507
  return /* @__PURE__ */ jsxRuntime.jsx(
12507
12508
  "div",
12508
12509
  {
12510
+ ref: scrollRef,
12509
12511
  className: cn(
12510
12512
  "grid bg-surface2 border max-h-full border-border1 rounded-xl overflow-y-auto content-start",
12511
12513
  className
@@ -12526,32 +12528,46 @@ const dataListRowStyles = [
12526
12528
  "transition-colors duration-200 rounded-lg"
12527
12529
  ];
12528
12530
 
12529
- function DataListRow({ children, className }) {
12530
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn(...dataListRowStyles, className), children });
12531
- }
12531
+ const DataListRow = React.forwardRef(({ children, className, ...rest }, ref) => {
12532
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { ref, className: cn(...dataListRowStyles, className), ...rest, children });
12533
+ });
12534
+ DataListRow.displayName = "DataListRow";
12532
12535
 
12533
- function DataListRowButton({ children, onClick, className }) {
12534
- return /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick, className: cn(...dataListRowStyles, "text-left", className), children });
12535
- }
12536
+ const DataListRowButton = React.forwardRef(
12537
+ ({ children, className, type = "button", ...rest }, ref) => {
12538
+ return /* @__PURE__ */ jsxRuntime.jsx("button", { ref, type, className: cn(...dataListRowStyles, "text-left", className), ...rest, children });
12539
+ }
12540
+ );
12541
+ DataListRowButton.displayName = "DataListRowButton";
12536
12542
 
12537
12543
  function DataListRowLink({ children, to, className, LinkComponent: Link }) {
12538
12544
  return /* @__PURE__ */ jsxRuntime.jsx(Link, { href: to, className: cn(...dataListRowStyles, className), children });
12539
12545
  }
12540
12546
 
12541
- function DataListSubheader({ children, className }) {
12542
- return /* @__PURE__ */ jsxRuntime.jsx(
12543
- "div",
12544
- {
12545
- className: cn(
12546
- "data-list-subheader relative isolate col-span-full px-4 py-3 border-none text-ui-md text-neutral4 font-medium mx-1",
12547
- "before:absolute before:inset-x-0 before:inset-y-1 before:bg-surface4 before:rounded-md before:-z-1",
12548
- className
12549
- ),
12550
- children
12551
- }
12552
- );
12547
+ function DataListSpacer({ height }) {
12548
+ if (height <= 0) return null;
12549
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "col-span-full", style: { height } });
12553
12550
  }
12554
12551
 
12552
+ const DataListSubheader = React.forwardRef(
12553
+ ({ children, className, ...rest }, ref) => {
12554
+ return /* @__PURE__ */ jsxRuntime.jsx(
12555
+ "div",
12556
+ {
12557
+ ref,
12558
+ className: cn(
12559
+ "data-list-subheader relative isolate col-span-full px-4 py-3 border-none text-ui-md text-neutral4 font-medium mx-1",
12560
+ "before:absolute before:inset-x-0 before:inset-y-1 before:bg-surface4 before:rounded-md before:-z-1",
12561
+ className
12562
+ ),
12563
+ ...rest,
12564
+ children
12565
+ }
12566
+ );
12567
+ }
12568
+ );
12569
+ DataListSubheader.displayName = "DataListSubheader";
12570
+
12555
12571
  function DataListSubHeading({ children, className }) {
12556
12572
  return /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("text-ui-sm text-neutral2 font-normal", className), children });
12557
12573
  }
@@ -12636,6 +12652,7 @@ const DataList = Object.assign(DataListRoot, {
12636
12652
  NoMatch: DataListNoMatch,
12637
12653
  Subheader: DataListSubheader,
12638
12654
  SubHeading: DataListSubHeading,
12655
+ Spacer: DataListSpacer,
12639
12656
  NextPageLoading: DataListNextPageLoading,
12640
12657
  Pagination: DataListPagination
12641
12658
  });
@@ -12776,6 +12793,7 @@ const TracesDataList = Object.assign(TracesDataListRoot, {
12776
12793
  NoMatch: DataListNoMatch,
12777
12794
  Subheader: DataListSubheader,
12778
12795
  SubHeading: DataListSubHeading,
12796
+ Spacer: DataListSpacer,
12779
12797
  IdCell: TracesDataListIdCell,
12780
12798
  DateCell: TracesDataListDateCell,
12781
12799
  TimeCell: TracesDataListTimeCell,
@@ -13076,6 +13094,7 @@ const LogsDataList = Object.assign(DataListRoot, {
13076
13094
  Row: DataListRow,
13077
13095
  RowButton: DataListRowButton,
13078
13096
  RowLink: DataListRowLink,
13097
+ Spacer: DataListSpacer,
13079
13098
  NoMatch: DataListNoMatch,
13080
13099
  DateCell: LogsDataListDateCell,
13081
13100
  TimeCell: LogsDataListTimeCell,
@@ -17933,6 +17952,8 @@ function groupTracesByThread(traces) {
17933
17952
  }
17934
17953
 
17935
17954
  const COLUMNS$1 = "auto auto auto auto minmax(5rem,1fr) auto auto";
17955
+ const ROW_HEIGHT$1 = 36;
17956
+ const OVERSCAN$1 = 8;
17936
17957
  function TracesListView({
17937
17958
  traces,
17938
17959
  isLoading,
@@ -17945,32 +17966,73 @@ function TracesListView({
17945
17966
  groupByThread,
17946
17967
  threadTitles
17947
17968
  }) {
17969
+ const scrollRef = React.useRef(null);
17970
+ const items = React.useMemo(() => {
17971
+ if (traces.length === 0) return [];
17972
+ if (!groupByThread) {
17973
+ return traces.map((trace) => ({ kind: "row", key: trace.traceId, trace }));
17974
+ }
17975
+ const { groups, ungrouped } = groupTracesByThread(traces);
17976
+ const result = [];
17977
+ for (const group of groups) {
17978
+ result.push({
17979
+ kind: "subheader",
17980
+ key: `header-${group.threadId}`,
17981
+ node: /* @__PURE__ */ jsxRuntime.jsxs(TracesDataList.SubHeading, { className: "flex gap-2", children: [
17982
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "uppercase", children: "Thread" }),
17983
+ threadTitles?.[group.threadId] && /* @__PURE__ */ jsxRuntime.jsxs("b", { children: [
17984
+ "'",
17985
+ threadTitles[group.threadId],
17986
+ "'"
17987
+ ] }),
17988
+ /* @__PURE__ */ jsxRuntime.jsxs("b", { children: [
17989
+ "# ",
17990
+ group.threadId
17991
+ ] }),
17992
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-neutral2", children: [
17993
+ "(",
17994
+ group.traces.length,
17995
+ ")"
17996
+ ] })
17997
+ ] })
17998
+ });
17999
+ for (const trace of group.traces) {
18000
+ result.push({ kind: "row", key: trace.traceId, trace });
18001
+ }
18002
+ }
18003
+ if (ungrouped.length > 0) {
18004
+ result.push({
18005
+ kind: "subheader",
18006
+ key: "header-ungrouped",
18007
+ node: /* @__PURE__ */ jsxRuntime.jsxs(TracesDataList.SubHeading, { className: "flex gap-2 uppercase", children: [
18008
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: "No thread" }),
18009
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-neutral2", children: [
18010
+ "(",
18011
+ ungrouped.length,
18012
+ ")"
18013
+ ] })
18014
+ ] })
18015
+ });
18016
+ for (const trace of ungrouped) {
18017
+ result.push({ kind: "row", key: trace.traceId, trace });
18018
+ }
18019
+ }
18020
+ return result;
18021
+ }, [traces, groupByThread, threadTitles]);
18022
+ const virtualizer = reactVirtual.useVirtualizer({
18023
+ count: items.length,
18024
+ getScrollElement: () => scrollRef.current,
18025
+ estimateSize: () => ROW_HEIGHT$1,
18026
+ overscan: OVERSCAN$1
18027
+ });
17948
18028
  if (isLoading) {
17949
18029
  return /* @__PURE__ */ jsxRuntime.jsx(DataListSkeleton, { columns: COLUMNS$1 });
17950
18030
  }
17951
- const renderRows = (rows) => rows.map((trace) => {
17952
- const isFeatured = trace.traceId === featuredTraceId;
17953
- const displayDate = trace.startedAt ?? trace.createdAt;
17954
- const entityName = trace.entityName || trace.entityId || trace.attributes?.agentId || trace.attributes?.workflowId;
17955
- return /* @__PURE__ */ jsxRuntime.jsxs(
17956
- TracesDataList.RowButton,
17957
- {
17958
- onClick: () => onTraceClick(trace),
17959
- className: cn(isFeatured && "bg-surface4"),
17960
- children: [
17961
- /* @__PURE__ */ jsxRuntime.jsx(TracesDataList.IdCell, { traceId: trace.traceId }),
17962
- /* @__PURE__ */ jsxRuntime.jsx(TracesDataList.DateCell, { timestamp: displayDate }),
17963
- /* @__PURE__ */ jsxRuntime.jsx(TracesDataList.TimeCell, { timestamp: displayDate }),
17964
- /* @__PURE__ */ jsxRuntime.jsx(TracesDataList.NameCell, { name: trace.name }),
17965
- /* @__PURE__ */ jsxRuntime.jsx(TracesDataList.InputCell, { input: getInputPreview(trace.input) }),
17966
- /* @__PURE__ */ jsxRuntime.jsx(TracesDataList.EntityCell, { entityType: trace.entityType, entityName }),
17967
- /* @__PURE__ */ jsxRuntime.jsx(TracesDataList.StatusCell, { status: trace.attributes?.status })
17968
- ]
17969
- },
17970
- trace.traceId
17971
- );
17972
- });
17973
- return /* @__PURE__ */ jsxRuntime.jsxs(TracesDataList, { columns: COLUMNS$1, className: "min-w-0", children: [
18031
+ const virtualItems = virtualizer.getVirtualItems();
18032
+ const totalSize = virtualizer.getTotalSize();
18033
+ const paddingTop = virtualItems[0]?.start ?? 0;
18034
+ const paddingBottom = virtualItems.length > 0 ? Math.max(0, totalSize - (virtualItems[virtualItems.length - 1]?.end ?? 0)) : 0;
18035
+ return /* @__PURE__ */ jsxRuntime.jsxs(TracesDataList, { columns: COLUMNS$1, scrollRef, className: "min-w-0", children: [
17974
18036
  /* @__PURE__ */ jsxRuntime.jsxs(TracesDataList.Top, { children: [
17975
18037
  /* @__PURE__ */ jsxRuntime.jsx(TracesDataList.TopCell, { children: "ID" }),
17976
18038
  /* @__PURE__ */ jsxRuntime.jsx(TracesDataList.TopCell, { children: "Date" }),
@@ -17980,55 +18042,53 @@ function TracesListView({
17980
18042
  /* @__PURE__ */ jsxRuntime.jsx(TracesDataList.TopCell, { children: "Entity" }),
17981
18043
  /* @__PURE__ */ jsxRuntime.jsx(TracesDataList.TopCell, { children: "Status" })
17982
18044
  ] }),
17983
- traces.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(
18045
+ items.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(
17984
18046
  TracesDataList.NoMatch,
17985
18047
  {
17986
18048
  message: filtersApplied ? "No traces found for applied filters" : "No traces found yet"
17987
18049
  }
17988
- ) : groupByThread ? (() => {
17989
- const { groups, ungrouped } = groupTracesByThread(traces);
17990
- return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
17991
- groups.map((group) => /* @__PURE__ */ jsxRuntime.jsxs(React.Fragment, { children: [
17992
- /* @__PURE__ */ jsxRuntime.jsx(TracesDataList.Subheader, { children: /* @__PURE__ */ jsxRuntime.jsxs(TracesDataList.SubHeading, { className: "flex gap-2", children: [
17993
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "uppercase", children: "Thread" }),
17994
- threadTitles?.[group.threadId] && /* @__PURE__ */ jsxRuntime.jsxs("b", { children: [
17995
- "'",
17996
- threadTitles[group.threadId],
17997
- "'"
17998
- ] }),
17999
- /* @__PURE__ */ jsxRuntime.jsxs("b", { children: [
18000
- "# ",
18001
- group.threadId
18002
- ] }),
18003
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-neutral2", children: [
18004
- "(",
18005
- group.traces.length,
18006
- ")"
18007
- ] })
18008
- ] }) }),
18009
- renderRows(group.traces)
18010
- ] }, group.threadId)),
18011
- ungrouped.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
18012
- /* @__PURE__ */ jsxRuntime.jsx(TracesDataList.Subheader, { children: /* @__PURE__ */ jsxRuntime.jsxs(TracesDataList.SubHeading, { className: "flex gap-2 uppercase", children: [
18013
- /* @__PURE__ */ jsxRuntime.jsx("span", { children: "No thread" }),
18014
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-neutral2", children: [
18015
- "(",
18016
- ungrouped.length,
18017
- ")"
18018
- ] })
18019
- ] }) }),
18020
- renderRows(ungrouped)
18021
- ] })
18022
- ] });
18023
- })() : renderRows(traces),
18024
- traces.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(
18025
- TracesDataList.NextPageLoading,
18026
- {
18027
- isLoading: isFetchingNextPage,
18028
- hasMore: hasNextPage,
18029
- setEndOfListElement
18030
- }
18031
- )
18050
+ ) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
18051
+ /* @__PURE__ */ jsxRuntime.jsx(TracesDataList.Spacer, { height: paddingTop }),
18052
+ virtualItems.map((vi) => {
18053
+ const item = items[vi.index];
18054
+ if (!item) return null;
18055
+ if (item.kind === "subheader") {
18056
+ return /* @__PURE__ */ jsxRuntime.jsx(TracesDataList.Subheader, { ref: virtualizer.measureElement, "data-index": vi.index, children: item.node }, item.key);
18057
+ }
18058
+ const trace = item.trace;
18059
+ const isFeatured = trace.traceId === featuredTraceId;
18060
+ const displayDate = trace.startedAt ?? trace.createdAt;
18061
+ const entityName = trace.entityName || trace.entityId || trace.attributes?.agentId || trace.attributes?.workflowId;
18062
+ return /* @__PURE__ */ jsxRuntime.jsxs(
18063
+ TracesDataList.RowButton,
18064
+ {
18065
+ ref: virtualizer.measureElement,
18066
+ "data-index": vi.index,
18067
+ onClick: () => onTraceClick(trace),
18068
+ className: cn(isFeatured && "bg-surface4"),
18069
+ children: [
18070
+ /* @__PURE__ */ jsxRuntime.jsx(TracesDataList.IdCell, { traceId: trace.traceId }),
18071
+ /* @__PURE__ */ jsxRuntime.jsx(TracesDataList.DateCell, { timestamp: displayDate }),
18072
+ /* @__PURE__ */ jsxRuntime.jsx(TracesDataList.TimeCell, { timestamp: displayDate }),
18073
+ /* @__PURE__ */ jsxRuntime.jsx(TracesDataList.NameCell, { name: trace.name }),
18074
+ /* @__PURE__ */ jsxRuntime.jsx(TracesDataList.InputCell, { input: getInputPreview(trace.input) }),
18075
+ /* @__PURE__ */ jsxRuntime.jsx(TracesDataList.EntityCell, { entityType: trace.entityType, entityName }),
18076
+ /* @__PURE__ */ jsxRuntime.jsx(TracesDataList.StatusCell, { status: trace.attributes?.status })
18077
+ ]
18078
+ },
18079
+ trace.traceId
18080
+ );
18081
+ }),
18082
+ /* @__PURE__ */ jsxRuntime.jsx(TracesDataList.Spacer, { height: paddingBottom }),
18083
+ /* @__PURE__ */ jsxRuntime.jsx(
18084
+ TracesDataList.NextPageLoading,
18085
+ {
18086
+ isLoading: isFetchingNextPage,
18087
+ hasMore: hasNextPage,
18088
+ setEndOfListElement
18089
+ }
18090
+ )
18091
+ ] })
18032
18092
  ] });
18033
18093
  }
18034
18094
 
@@ -19049,6 +19109,8 @@ function LogsLayout({ listSlot, logPanelSlot, tracePanelSlot, spanPanelSlot, log
19049
19109
  }
19050
19110
 
19051
19111
  const COLUMNS = "auto auto auto auto minmax(5rem,1fr) minmax(5rem,1fr)";
19112
+ const ROW_HEIGHT = 36;
19113
+ const OVERSCAN = 8;
19052
19114
  function LogsListView({
19053
19115
  logs,
19054
19116
  isLoading,
@@ -19059,10 +19121,21 @@ function LogsListView({
19059
19121
  featuredLogId,
19060
19122
  onLogClick
19061
19123
  }) {
19124
+ const scrollRef = React.useRef(null);
19125
+ const virtualizer = reactVirtual.useVirtualizer({
19126
+ count: logs.length,
19127
+ getScrollElement: () => scrollRef.current,
19128
+ estimateSize: () => ROW_HEIGHT,
19129
+ overscan: OVERSCAN
19130
+ });
19062
19131
  if (isLoading) {
19063
19132
  return /* @__PURE__ */ jsxRuntime.jsx(DataListSkeleton, { columns: COLUMNS });
19064
19133
  }
19065
- return /* @__PURE__ */ jsxRuntime.jsxs(LogsDataList, { columns: COLUMNS, className: "min-w-0", children: [
19134
+ const virtualItems = virtualizer.getVirtualItems();
19135
+ const totalSize = virtualizer.getTotalSize();
19136
+ const paddingTop = virtualItems[0]?.start ?? 0;
19137
+ const paddingBottom = virtualItems.length > 0 ? Math.max(0, totalSize - (virtualItems[virtualItems.length - 1]?.end ?? 0)) : 0;
19138
+ return /* @__PURE__ */ jsxRuntime.jsxs(LogsDataList, { columns: COLUMNS, scrollRef, className: "min-w-0", children: [
19066
19139
  /* @__PURE__ */ jsxRuntime.jsxs(LogsDataList.Top, { children: [
19067
19140
  /* @__PURE__ */ jsxRuntime.jsx(LogsDataList.TopCell, { children: "Date" }),
19068
19141
  /* @__PURE__ */ jsxRuntime.jsx(LogsDataList.TopCell, { children: "Time" }),
@@ -19071,27 +19144,35 @@ function LogsListView({
19071
19144
  /* @__PURE__ */ jsxRuntime.jsx(LogsDataList.TopCell, { children: "Message" }),
19072
19145
  /* @__PURE__ */ jsxRuntime.jsx(LogsDataList.TopCell, { children: "Data" })
19073
19146
  ] }),
19074
- logs.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(LogsDataList.NoMatch, { message: "No logs match your search" }) : logs.map((log) => {
19075
- const id = logIdMap.get(log);
19076
- if (!id) return null;
19077
- const isFeatured = id === featuredLogId;
19078
- return /* @__PURE__ */ jsxRuntime.jsxs(
19079
- LogsDataList.RowButton,
19080
- {
19081
- onClick: () => onLogClick(log),
19082
- className: cn(isFeatured && "bg-surface4"),
19083
- children: [
19084
- /* @__PURE__ */ jsxRuntime.jsx(LogsDataList.DateCell, { timestamp: log.timestamp }),
19085
- /* @__PURE__ */ jsxRuntime.jsx(LogsDataList.TimeCell, { timestamp: log.timestamp }),
19086
- /* @__PURE__ */ jsxRuntime.jsx(LogsDataList.LevelCell, { level: log.level }),
19087
- /* @__PURE__ */ jsxRuntime.jsx(LogsDataList.EntityCell, { entityType: log.entityType, entityName: log.entityName }),
19088
- /* @__PURE__ */ jsxRuntime.jsx(LogsDataList.MessageCell, { message: log.message }),
19089
- /* @__PURE__ */ jsxRuntime.jsx(LogsDataList.DataCell, { data: log.data })
19090
- ]
19091
- },
19092
- id
19093
- );
19094
- }),
19147
+ logs.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(LogsDataList.NoMatch, { message: "No logs match your search" }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
19148
+ /* @__PURE__ */ jsxRuntime.jsx(LogsDataList.Spacer, { height: paddingTop }),
19149
+ virtualItems.map((vi) => {
19150
+ const log = logs[vi.index];
19151
+ if (!log) return null;
19152
+ const id = logIdMap.get(log);
19153
+ if (!id) return null;
19154
+ const isFeatured = id === featuredLogId;
19155
+ return /* @__PURE__ */ jsxRuntime.jsxs(
19156
+ LogsDataList.RowButton,
19157
+ {
19158
+ ref: virtualizer.measureElement,
19159
+ "data-index": vi.index,
19160
+ onClick: () => onLogClick(log),
19161
+ className: cn(isFeatured && "bg-surface4"),
19162
+ children: [
19163
+ /* @__PURE__ */ jsxRuntime.jsx(LogsDataList.DateCell, { timestamp: log.timestamp }),
19164
+ /* @__PURE__ */ jsxRuntime.jsx(LogsDataList.TimeCell, { timestamp: log.timestamp }),
19165
+ /* @__PURE__ */ jsxRuntime.jsx(LogsDataList.LevelCell, { level: log.level }),
19166
+ /* @__PURE__ */ jsxRuntime.jsx(LogsDataList.EntityCell, { entityType: log.entityType, entityName: log.entityName }),
19167
+ /* @__PURE__ */ jsxRuntime.jsx(LogsDataList.MessageCell, { message: log.message }),
19168
+ /* @__PURE__ */ jsxRuntime.jsx(LogsDataList.DataCell, { data: log.data })
19169
+ ]
19170
+ },
19171
+ id
19172
+ );
19173
+ }),
19174
+ /* @__PURE__ */ jsxRuntime.jsx(LogsDataList.Spacer, { height: paddingBottom })
19175
+ ] }),
19095
19176
  /* @__PURE__ */ jsxRuntime.jsx(
19096
19177
  LogsDataList.NextPageLoading,
19097
19178
  {