@mastra/playground-ui 30.0.0-alpha.9 → 30.0.1-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,221 @@
1
1
  # @mastra/playground-ui
2
2
 
3
+ ## 30.0.1-alpha.0
4
+
5
+ ### Patch Changes
6
+
7
+ - Removed the EntityList and EntityListPageLayout components — they were superseded by DataList. The 9 Studio root list pages (Agents, Datasets, Experiments, MCPs, Processors, Prompts, Scorers, Tools, Workflows) now build on DataList, matching the condensed layout shared across the rest of Studio. ([#17058](https://github.com/mastra-ai/mastra/pull/17058))
8
+
9
+ **Migration**
10
+
11
+ If you were importing EntityList or EntityListPageLayout from `@mastra/playground-ui`, switch to DataList — its API is a strict superset:
12
+
13
+ ```tsx
14
+ // Before
15
+ import { EntityList, EntityListSkeleton } from '@mastra/playground-ui';
16
+
17
+ // After
18
+ import { DataList, DataListSkeleton } from '@mastra/playground-ui';
19
+ ```
20
+
21
+ The primitive names match (`.Top`, `.TopCell`, `.TopCellSmart`, `.RowLink`, `.Cell`, `.TextCell`, `.NameCell`, `.DescriptionCell`, `.NoMatch`, `.Pagination`). DataList additionally exposes `.Row`, `.RowButton`, `.RowStatic`, `.IdCell`, `.MonoCell`, `.SelectCell`, `.NextPageLoading`, and more — useful when you need selection rows or action cells outside a RowLink.
22
+
23
+ ## 30.0.0
24
+
25
+ ### Minor Changes
26
+
27
+ - Added a Drawer component — a panel that slides in from any edge of the screen with swipe-to-dismiss gestures. ([#16958](https://github.com/mastra-ai/mastra/pull/16958))
28
+
29
+ The Drawer can be anchored to any of the four screen edges and supports snap points, nested stacking, controlled state, non-modal mode, swipe-to-open areas, and detached triggers.
30
+
31
+ ```tsx
32
+ import {
33
+ Drawer,
34
+ DrawerTrigger,
35
+ DrawerContent,
36
+ DrawerHeader,
37
+ DrawerTitle,
38
+ DrawerDescription,
39
+ DrawerFooter,
40
+ DrawerClose,
41
+ Button,
42
+ } from '@mastra/playground-ui';
43
+
44
+ <Drawer side="right">
45
+ <DrawerTrigger asChild>
46
+ <Button>Open</Button>
47
+ </DrawerTrigger>
48
+ <DrawerContent>
49
+ <DrawerHeader>
50
+ <DrawerTitle>Library</DrawerTitle>
51
+ <DrawerDescription>A panel that slides in from the right edge.</DrawerDescription>
52
+ </DrawerHeader>
53
+ <DrawerFooter>
54
+ <DrawerClose asChild>
55
+ <Button variant="outline">Close</Button>
56
+ </DrawerClose>
57
+ </DrawerFooter>
58
+ </DrawerContent>
59
+ </Drawer>;
60
+ ```
61
+
62
+ - Added a reusable `HoverCard` component (`HoverCard`, `HoverCardTrigger`, `HoverCardContent`) built on Base UI. You can now use these exported components to add hover card interactions anywhere in your UI. ([#16919](https://github.com/mastra-ai/mastra/pull/16919))
63
+
64
+ ```tsx
65
+ import { HoverCard, HoverCardTrigger, HoverCardContent } from '@mastra/playground-ui';
66
+
67
+ <HoverCard>
68
+ <HoverCardTrigger>Weather Agent</HoverCardTrigger>
69
+ <HoverCardContent>Answers questions about current conditions and forecasts.</HoverCardContent>
70
+ </HoverCard>;
71
+ ```
72
+
73
+ ### Patch Changes
74
+
75
+ - Migrated the Switch component to Base UI for smoother animations and consistent behavior. No API changes — `checked`, `defaultChecked`, `onCheckedChange`, and `disabled` work exactly as before. ([#16891](https://github.com/mastra-ai/mastra/pull/16891))
76
+
77
+ - Improved the Select component by migrating it to Base UI for more reliable positioning and accessibility. The public API (`Select`, `SelectTrigger`, `SelectContent`, `SelectItem`, `SelectValue`, `SelectGroup`) is unchanged, so no consumer updates are needed. ([#16918](https://github.com/mastra-ai/mastra/pull/16918))
78
+
79
+ - Added `DataList.RowStatic`, a non-interactive row primitive. It renders a row that looks identical to other list rows but does not respond to clicks and shows no hover/focus state — use it alongside `DataList.RowButton` / `DataList.RowLink` when only some rows are clickable (e.g. error or placeholder entries in an otherwise navigable list). ([#16970](https://github.com/mastra-ai/mastra/pull/16970))
80
+
81
+ ```tsx
82
+ {
83
+ rows.map(row =>
84
+ row.href ? (
85
+ <DataList.RowLink key={row.id} to={row.href} LinkComponent={Link}>
86
+ {row.cells}
87
+ </DataList.RowLink>
88
+ ) : (
89
+ <DataList.RowStatic key={row.id}>{row.cells}</DataList.RowStatic>
90
+ ),
91
+ );
92
+ }
93
+ ```
94
+
95
+ - Added `DataList` primitives and props for building selection-aware, condensed list rows that match the Traces/Logs visual style. ([#16820](https://github.com/mastra-ai/mastra/pull/16820))
96
+
97
+ **New cells** on `DataList`:
98
+ - `IdCell` — compact mono cell that truncates long IDs to 8 chars.
99
+ - `MonoCell` — compact mono + truncate text cell (for input previews, JSON summaries, etc.).
100
+ - `DateCell` — compact date cell rendering "Today" or "MMM dd".
101
+ - `TimeCell` — compact mono time cell rendering `HH:mm:ss.SSS` with the millisecond portion tinted.
102
+ - `SelectCell` — labelled checkbox cell with a shift-key range-select handler.
103
+ - `TopSelectCell` — header version with `indeterminate` support for "select all".
104
+ - `TopCells` — non-interactive header sibling of `RowButton`, for hosting top cells beside a leading select cell.
105
+
106
+ **New props** on `DataList.RowButton` and `DataList.RowLink`:
107
+ - `flushLeft` — drops the default left margin when wrapped beside a leading cell.
108
+ - `colStart` — places the row starting at a column line (e.g. `colStart={2}` to leave column 1 for a leading cell).
109
+ - `featured` — applies the highlighted background to mark the active row.
110
+
111
+ **New props** on existing wrappers:
112
+ - `as` on `DataList.Cell` and `DataList.TopCell` — render the cell as any HTML element (e.g. `<label>` so the whole cell is clickable).
113
+ - `hasLeadingCell` on `DataList.Top` — drops default gap and left padding so a leading cell sits flush, mirroring how `Row` + `RowButton` compose.
114
+
115
+ **Example** — selection row with a checkbox in column 1 and an interactive button spanning the rest:
116
+
117
+ ```tsx
118
+ <DataList.Row>
119
+ <DataList.SelectCell checked={isSelected} onToggle={shiftKey => toggle(id, shiftKey)} />
120
+ <DataList.RowButton flushLeft colStart={2} featured={isFeatured} onClick={onRowClick}>
121
+ <DataList.IdCell id={item.id} />
122
+ <DataList.MonoCell>{item.input}</DataList.MonoCell>
123
+ </DataList.RowButton>
124
+ </DataList.Row>
125
+ ```
126
+
127
+ Internally the Traces and Logs list views now use the shared primitives — no behavior change for those consumers.
128
+
129
+ - Added support for trailing cells in `DataList` rows. `DataList.RowButton` and `DataList.RowLink` now accept `colEnd` and `flushRight` (mirrors of the existing `colStart`/`flushLeft`), so a row can sit beside a non-interactive trailing cell (e.g. an actions column) and stay aligned with the header. Rows wrapped in `DataList.Row` now render a full-width separator that extends through the leading and trailing cells. `DataList.MonoCell` also gained an optional `height` prop so non-compact lists can use it without forcing compact padding. ([#16888](https://github.com/mastra-ai/mastra/pull/16888))
130
+
131
+ **Usage**
132
+
133
+ ```tsx
134
+ <DataList.Row>
135
+ <DataList.RowButton flushLeft flushRight colEnd={-2} onClick={onClick}>
136
+ {/* main row content */}
137
+ </DataList.RowButton>
138
+ <DataList.Cell>
139
+ {/* trailing actions, e.g. icon buttons */}
140
+ </DataList.Cell>
141
+ </DataList.Row>
142
+
143
+ <DataList.MonoCell height="default">long mono text…</DataList.MonoCell>
144
+ ```
145
+
146
+ - Migrated the Label component off Radix UI. It now renders a native `<label>` element with the same props and styling — `htmlFor`, `className`, and children behave exactly as before. ([#16892](https://github.com/mastra-ai/mastra/pull/16892))
147
+
148
+ - Fixed Studio Settings page (and other default-height `PageLayout` pages) clipping their content with no scrollbar on viewports shorter than the form. Users on short laptop screens (under ~991px tall) could not reach the Save button under the Mastra Connection headers form, making it impossible to apply changes. Default-height `PageLayout` pages now grow with their content and scroll through the studio chrome wrapper; `height="full"` pages (Logs, Traces, Metrics, etc.) are unchanged. ([#16999](https://github.com/mastra-ai/mastra/pull/16999))
149
+
150
+ - Restyled scrollbars across the studio UI to match the design system — thin, themed thumb on a transparent track — replacing the default OS scrollbars that clashed with dark and light surfaces. ([#16918](https://github.com/mastra-ai/mastra/pull/16918))
151
+
152
+ - Exported ContextMenu from the package entry so it can be imported alongside other Base UI primitives. ([#17062](https://github.com/mastra-ai/mastra/pull/17062))
153
+
154
+ - Design-system additions to support theming: ([#17059](https://github.com/mastra-ai/mastra/pull/17059))
155
+ - `Avatar` now accepts optional `color` and `textColor` props for per-instance tinting, and falls back to the initial when the image fails to load.
156
+ - `Searchbar` accepts an optional `className` to let consumers tune layout without forking.
157
+ - `TabList` accepts a `style` prop and the active-tab indicator now reads from the `--tab-indicator-color` CSS variable, letting parents theme the indicator (e.g. per-agent accent color).
158
+ - `stringToColor` now accepts any `number` for the `lightness` argument and defaults to `90` instead of `75` for a lighter fallback chip.
159
+ - Global `body` rule enables `font-smoothing` / `-webkit-font-smoothing` for crisper UI text.
160
+
161
+ - Removed `EntryList` and its sub-components (`EntryList.Header`, `EntryList.Entries`, `EntryList.Entry`, `EntryList.EntryText`, `EntryList.Pagination`, `EntryList.NoMatch`, `EntryListSkeleton`, etc.) from the public API. All in-repo list views have migrated to `DataList`, which is the recommended replacement. ([#16910](https://github.com/mastra-ai/mastra/pull/16910))
162
+
163
+ **Migration:**
164
+
165
+ ```tsx
166
+ // Before
167
+ import { EntryList, EntryListSkeleton } from '@mastra/playground-ui';
168
+
169
+ <EntryList>
170
+ <EntryList.Trim>
171
+ <EntryList.Header columns={columns} />
172
+ <EntryList.Entries>
173
+ {items.map(item => (
174
+ <EntryList.Entry key={item.id} columns={columns} entry={item} onClick={…}>
175
+ {columns.map(col => <EntryList.EntryText key={col.name}>{item[col.name]}</EntryList.EntryText>)}
176
+ </EntryList.Entry>
177
+ ))}
178
+ </EntryList.Entries>
179
+ </EntryList.Trim>
180
+ <EntryList.Pagination …/>
181
+ </EntryList>
182
+
183
+ // After
184
+ import { DataList } from '@mastra/playground-ui';
185
+
186
+ <DataList columns={gridColumns}>
187
+ <DataList.Top>
188
+ {columns.map(col => <DataList.TopCell key={col.name}>{col.label}</DataList.TopCell>)}
189
+ </DataList.Top>
190
+ {items.map(item => (
191
+ <DataList.RowButton key={item.id} onClick={…}>
192
+ {columns.map(col => <DataList.Cell key={col.name}>{item[col.name]}</DataList.Cell>)}
193
+ </DataList.RowButton>
194
+ ))}
195
+ <DataList.Pagination …/>
196
+ </DataList>
197
+ ```
198
+
199
+ - Improved the Checkbox component by migrating it to Base UI. The public API is unchanged — `checked` (including the `'indeterminate'` value), `defaultChecked`, `onCheckedChange`, and `disabled` all behave as before. ([#16905](https://github.com/mastra-ai/mastra/pull/16905))
200
+
201
+ - Fixed MetricsDataTable sticky header and column backgrounds to use surface3 token, matching DashboardCard surface ([#16828](https://github.com/mastra-ai/mastra/pull/16828))
202
+
203
+ - Improved the RadioGroup component by migrating it to Base UI. The public API (`RadioGroup`, `RadioGroupItem`, `value`, `onValueChange`, `disabled`) is unchanged. Also fixes the radio indicator sizing/centering — the control now stays square and the inner dot is properly centered. ([#16904](https://github.com/mastra-ai/mastra/pull/16904))
204
+
205
+ - Updated dependencies [[`cfa2e3a`](https://github.com/mastra-ai/mastra/commit/cfa2e3a5292322f48bb28b4d257d631da7f9d3cc), [`0cbece9`](https://github.com/mastra-ai/mastra/commit/0cbece9d832cb134a74cdbf3682d390a058215a4), [`2f5f58a`](https://github.com/mastra-ai/mastra/commit/2f5f58a9a8bb13bcdc6789db221eef7c9bf1ff02), [`2f5f58a`](https://github.com/mastra-ai/mastra/commit/2f5f58a9a8bb13bcdc6789db221eef7c9bf1ff02), [`7dfe1bc`](https://github.com/mastra-ai/mastra/commit/7dfe1bcfe71d261a6fd6bbf29b1dec49d78fb98f), [`ac442a4`](https://github.com/mastra-ai/mastra/commit/ac442a42fda0354ac2bcea772bf6691cb3e9dbb3), [`b7286f4`](https://github.com/mastra-ai/mastra/commit/b7286f4308267f5fd70e6bfee10dba9472640906), [`6096445`](https://github.com/mastra-ai/mastra/commit/60964459733f0ab384584d95e19c36607ffdf7b0), [`d72dc4b`](https://github.com/mastra-ai/mastra/commit/d72dc4b12d832546c05c20255fa96fe4eb515900), [`a481027`](https://github.com/mastra-ai/mastra/commit/a481027b549ba1018414990c8f045eaee7b9f413), [`f1b9f87`](https://github.com/mastra-ai/mastra/commit/f1b9f87a00505f15d4fe39f92de287674adc2198), [`1e5c067`](https://github.com/mastra-ai/mastra/commit/1e5c067d2e20a781af670578180d1ee249806d41), [`168fa09`](https://github.com/mastra-ai/mastra/commit/168fa09d6b39114cb8c13bd06f1dccb9bc81c6cd), [`df1947a`](https://github.com/mastra-ai/mastra/commit/df1947affa40f742067542251fac7ca759492ef4), [`ee59b74`](https://github.com/mastra-ai/mastra/commit/ee59b743ce73ad11784b4d9c6fbba8568edee1c8), [`a97b1a0`](https://github.com/mastra-ai/mastra/commit/a97b1a0abaed83946c3519d1e0f680d0815b8a67), [`af2e1f8`](https://github.com/mastra-ai/mastra/commit/af2e1f8e2a2d2c4ba75167d5c93ca44395639eff), [`008baaf`](https://github.com/mastra-ai/mastra/commit/008baafd8d851f831407045aebead5a2e3342eff), [`271d891`](https://github.com/mastra-ai/mastra/commit/271d8917e4323340f9fe549f3e8de55810dbbcbe), [`801baa0`](https://github.com/mastra-ai/mastra/commit/801baa07cccdbaec1d00942a92bdc831111744a2), [`8116436`](https://github.com/mastra-ai/mastra/commit/81164363eb225d774e41ff27da6a5ea611406688), [`c35b962`](https://github.com/mastra-ai/mastra/commit/c35b9625c7e854fcfdeee226a3338a750d0ff211), [`c27c4b9`](https://github.com/mastra-ai/mastra/commit/c27c4b9f137df5414fca4e45896aceccff6b0ed5), [`08b3b59`](https://github.com/mastra-ai/mastra/commit/08b3b590dd960dee6c9a6e39272f8927d803db6e), [`b3c3b18`](https://github.com/mastra-ai/mastra/commit/b3c3b189121489a3a51a8fd8204b569be9a89fe5), [`c35b962`](https://github.com/mastra-ai/mastra/commit/c35b9625c7e854fcfdeee226a3338a750d0ff211), [`9be1545`](https://github.com/mastra-ai/mastra/commit/9be1545475eb81a716169bb1281a37853cc739e0), [`4084113`](https://github.com/mastra-ai/mastra/commit/408411370fc48a822e8b616b3b63f9409774e0e9), [`bc01b1b`](https://github.com/mastra-ai/mastra/commit/bc01b1bfafe381d90af909f8bce7eeb4eee779f2), [`70cb714`](https://github.com/mastra-ai/mastra/commit/70cb7149c8f16f478e15b58498254a53181750a4), [`91cf0e0`](https://github.com/mastra-ai/mastra/commit/91cf0e027e511b871481a8576b56b7af83b15afd), [`1120b4f`](https://github.com/mastra-ai/mastra/commit/1120b4fa928552c6ee1751efa5603d955841e766), [`7f9da22`](https://github.com/mastra-ai/mastra/commit/7f9da22efd5aa595e138a31de55a5f0f2f28b33d)]:
206
+ - @mastra/core@1.37.0
207
+ - @mastra/client-js@1.21.0
208
+ - @mastra/react@0.4.1
209
+
210
+ ## 30.0.0-alpha.10
211
+
212
+ ### Patch Changes
213
+
214
+ - Updated dependencies [[`d72dc4b`](https://github.com/mastra-ai/mastra/commit/d72dc4b12d832546c05c20255fa96fe4eb515900)]:
215
+ - @mastra/core@1.37.0-alpha.9
216
+ - @mastra/client-js@1.21.0-alpha.10
217
+ - @mastra/react@0.4.1-alpha.10
218
+
3
219
  ## 30.0.0-alpha.9
4
220
 
5
221
  ### Patch Changes
package/dist/index.cjs.js CHANGED
@@ -12837,11 +12837,11 @@ const ItemList = Object.assign(ItemListRoot, {
12837
12837
  LabelCell: ItemListLabelCell
12838
12838
  });
12839
12839
 
12840
- const widths$2 = ["75%", "50%", "65%", "90%", "60%", "80%"];
12840
+ const widths$1 = ["75%", "50%", "65%", "90%", "60%", "80%"];
12841
12841
  function ItemListItemsSkeleton({ columns, numberOfRows = 3 }) {
12842
12842
  const getPseudoRandomWidth = (rowIdx, colIdx) => {
12843
- const index = (rowIdx + colIdx + (columns?.length || 0) + (numberOfRows || 0)) % widths$2.length;
12844
- return widths$2[index];
12843
+ const index = (rowIdx + colIdx + (columns?.length || 0) + (numberOfRows || 0)) % widths$1.length;
12844
+ return widths$1[index];
12845
12845
  };
12846
12846
  return /* @__PURE__ */ jsxRuntime.jsx(ItemListItems, { children: Array.from({ length: numberOfRows }).map((_, rowIdx) => /* @__PURE__ */ jsxRuntime.jsx(ItemListRow, { children: /* @__PURE__ */ jsxRuntime.jsx(ItemListRowButton, { columns, children: (columns || []).map((col, colIdx) => {
12847
12847
  const key = `${col.name}-${colIdx}`;
@@ -13668,7 +13668,7 @@ function DataListTopCellWithTooltip({ children, tooltip, className }) {
13668
13668
  /* @__PURE__ */ jsxRuntime.jsx(TooltipContent, { children: tooltip })
13669
13669
  ] });
13670
13670
  }
13671
- const breakpointClasses$1 = {
13671
+ const breakpointClasses = {
13672
13672
  sm: { show: "hidden sm:inline-flex", hide: "inline-flex sm:hidden" },
13673
13673
  md: { show: "hidden md:inline-flex", hide: "inline-flex md:hidden" },
13674
13674
  lg: { show: "hidden lg:inline-flex", hide: "inline-flex lg:hidden" },
@@ -13683,7 +13683,7 @@ function DataListTopCellSmart({
13683
13683
  className
13684
13684
  }) {
13685
13685
  const tooltipText = tooltip ?? (typeof long === "string" ? long : void 0);
13686
- const bp = breakpointClasses$1[breakpoint];
13686
+ const bp = breakpointClasses[breakpoint];
13687
13687
  const content = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
13688
13688
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("items-center gap-1", bp.show), children: long }),
13689
13689
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("items-center gap-1", bp.hide), children: short })
@@ -13756,14 +13756,14 @@ const DataList = Object.assign(DataListRoot, {
13756
13756
  Pagination: DataListPagination
13757
13757
  });
13758
13758
 
13759
- const widths$1 = ["75%", "50%", "65%", "90%", "60%", "80%"];
13759
+ const widths = ["75%", "50%", "65%", "90%", "60%", "80%"];
13760
13760
  function DataListSkeleton({ columns = "auto 1fr auto auto", numberOfRows = 3 }) {
13761
13761
  const columnParts = columns.trim().split(/\s+/);
13762
13762
  const columnCount = columnParts.length;
13763
13763
  const skeletonColumns = columnParts.map((col) => col === "auto" ? "minmax(6rem, auto)" : col).join(" ");
13764
13764
  const getPseudoRandomWidth = (rowIdx, colIdx) => {
13765
- const index = (rowIdx + colIdx + columnCount + numberOfRows) % widths$1.length;
13766
- return widths$1[index];
13765
+ const index = (rowIdx + colIdx + columnCount + numberOfRows) % widths.length;
13766
+ return widths[index];
13767
13767
  };
13768
13768
  return /* @__PURE__ */ jsxRuntime.jsx(DataListRoot, { columns: skeletonColumns, children: Array.from({ length: numberOfRows }).map((_, rowIdx) => /* @__PURE__ */ jsxRuntime.jsx(
13769
13769
  "div",
@@ -13889,221 +13889,6 @@ const TracesDataList = Object.assign(TracesDataListRoot, {
13889
13889
  NextPageLoading: DataListNextPageLoading
13890
13890
  });
13891
13891
 
13892
- function EntityListCell({ children, className }) {
13893
- return /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("relative py-4 grid items-center text-ui-md whitespace-nowrap text-neutral3", className), children });
13894
- }
13895
- function EntityListTextCell({ children, className }) {
13896
- return /* @__PURE__ */ jsxRuntime.jsx(EntityListCell, { className, children });
13897
- }
13898
- function EntityListNameCell({ children, className }) {
13899
- return /* @__PURE__ */ jsxRuntime.jsx(EntityListCell, { className: cn("text-left text-neutral4", className), children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children }) });
13900
- }
13901
- function EntityListDescriptionCell({ children, className }) {
13902
- return /* @__PURE__ */ jsxRuntime.jsx(EntityListCell, { className: cn("text-neutral2", className), children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children }) });
13903
- }
13904
-
13905
- function EntityListNoMatch({ message = "Nothing matches your search", className }) {
13906
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("col-span-full flex flex-col items-center justify-center gap-2 py-12 text-neutral3", className), children: /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-ui-md", children: message }) });
13907
- }
13908
-
13909
- function EntityListPagination({ currentPage, hasMore, onNextPage, onPrevPage }) {
13910
- const showNavigation = typeof currentPage === "number" && currentPage > 0 || hasMore;
13911
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("col-span-full flex items-center justify-center gap-8 pt-6 pb-4 text-ui-md text-neutral3"), children: [
13912
- /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
13913
- "Page ",
13914
- /* @__PURE__ */ jsxRuntime.jsx("b", { children: currentPage ? currentPage + 1 : "1" })
13915
- ] }),
13916
- showNavigation && /* @__PURE__ */ jsxRuntime.jsxs(
13917
- "div",
13918
- {
13919
- className: cn(
13920
- "flex gap-4",
13921
- "[&>button]:flex [&>button]:items-center [&>button]:gap-2 [&>button]:text-neutral4 [&>button:hover]:text-neutral5 [&>button]:transition-colors [&>button]:border [&>button]:border-border1 [&>button]:p-1 [&>button]:px-2 [&>button]:rounded-md",
13922
- "[&_svg]:w-[1em] [&_svg]:h-[1em] [&_svg]:text-neutral3"
13923
- ),
13924
- children: [
13925
- typeof currentPage === "number" && currentPage > 0 && /* @__PURE__ */ jsxRuntime.jsxs("button", { type: "button", onClick: onPrevPage, children: [
13926
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowLeftIcon, {}),
13927
- "Previous"
13928
- ] }),
13929
- hasMore && /* @__PURE__ */ jsxRuntime.jsxs("button", { type: "button", onClick: onNextPage, children: [
13930
- "Next",
13931
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowRightIcon, {})
13932
- ] })
13933
- ]
13934
- }
13935
- )
13936
- ] });
13937
- }
13938
-
13939
- function EntityListRoot({ children, columns, className }) {
13940
- return /* @__PURE__ */ jsxRuntime.jsx(
13941
- "div",
13942
- {
13943
- className: cn(
13944
- "grid bg-surface2 border h-full border-border1 rounded-xl overflow-y-auto content-start",
13945
- className
13946
- ),
13947
- style: { gridTemplateColumns: columns },
13948
- children
13949
- }
13950
- );
13951
- }
13952
-
13953
- function EntityListRow({ children, className, onClick, selected }) {
13954
- return /* @__PURE__ */ jsxRuntime.jsx(
13955
- "div",
13956
- {
13957
- role: onClick ? "button" : void 0,
13958
- tabIndex: onClick ? 0 : void 0,
13959
- onClick,
13960
- onKeyDown: onClick ? (e) => {
13961
- if (e.currentTarget !== e.target) return;
13962
- if (e.key === "Enter" || e.key === " ") {
13963
- e.preventDefault();
13964
- onClick();
13965
- }
13966
- } : void 0,
13967
- className: cn(
13968
- "entity-list-row grid grid-cols-subgrid gap-6 lg:gap-8 xl:gap-10 2xl:gap-12 3xl:gap-14 col-span-full cursor-pointer border-y border-b-border1 border-t-transparent px-5",
13969
- "hover:bg-surface4 hover:border-transparent focus-within:bg-surface4 focus-within:border-transparent focus-within:ring-1 focus-within:ring-inset focus-within:ring-accent1",
13970
- "[.entity-list-row:hover+&]:border-t-transparent [.entity-list-row:focus-within+&]:border-t-transparent",
13971
- "transition-colors duration-200 rounded-lg",
13972
- selected && "bg-surface4 border-transparent",
13973
- className
13974
- ),
13975
- children
13976
- }
13977
- );
13978
- }
13979
-
13980
- function EntityListRowLink({ children, to, className, LinkComponent: Link }) {
13981
- return /* @__PURE__ */ jsxRuntime.jsx(
13982
- Link,
13983
- {
13984
- href: to,
13985
- className: cn(
13986
- "entity-list-row grid grid-cols-subgrid gap-6 lg:gap-8 xl:gap-10 2xl:gap-12 3xl:gap-14 col-span-full px-5 outline-hidden cursor-pointer border-y border-b-border1 border-t-transparent",
13987
- "hover:bg-surface4 hover:border-transparent focus-within:bg-surface4 focus-within:border-transparent focus-within:ring-1 focus-within:ring-inset focus-within:ring-accent1",
13988
- "[.entity-list-row:hover+&]:border-t-transparent [.entity-list-row:focus-within+&]:border-t-transparent",
13989
- "transition-colors duration-200 rounded-lg",
13990
- className
13991
- ),
13992
- children
13993
- }
13994
- );
13995
- }
13996
-
13997
- function EntityListRows({ children, className }) {
13998
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("grid grid-cols-subgrid col-span-full overflow-y-auto p-1", className), children });
13999
- }
14000
-
14001
- function EntityListTop({ children, className }) {
14002
- return /* @__PURE__ */ jsxRuntime.jsx(
14003
- "div",
14004
- {
14005
- className: cn(
14006
- "grid grid-cols-subgrid gap-6 lg:gap-8 xl:gap-10 2xl:gap-12 3xl:gap-14 col-span-full border-b border-border1 px-4 bg-surface2 sticky top-0 z-10",
14007
- className
14008
- ),
14009
- children
14010
- }
14011
- );
14012
- }
14013
-
14014
- const EntityListTopCell = React.forwardRef(({ children, className }, ref) => {
14015
- return /* @__PURE__ */ jsxRuntime.jsx(
14016
- "span",
14017
- {
14018
- ref,
14019
- className: cn(
14020
- "h-8 py-1 flex items-center uppercase whitespace-nowrap text-neutral2 tracking-widest text-ui-xs",
14021
- className
14022
- ),
14023
- children
14024
- }
14025
- );
14026
- });
14027
- function EntityListTopCellWithTooltip({ children, tooltip, className }) {
14028
- return /* @__PURE__ */ jsxRuntime.jsxs(Tooltip, { children: [
14029
- /* @__PURE__ */ jsxRuntime.jsx(TooltipTrigger, { children: /* @__PURE__ */ jsxRuntime.jsx(EntityListTopCell, { className, children }) }),
14030
- /* @__PURE__ */ jsxRuntime.jsx(TooltipContent, { children: tooltip })
14031
- ] });
14032
- }
14033
- const breakpointClasses = {
14034
- sm: { show: "hidden sm:inline-flex", hide: "inline-flex sm:hidden" },
14035
- md: { show: "hidden md:inline-flex", hide: "inline-flex md:hidden" },
14036
- lg: { show: "hidden lg:inline-flex", hide: "inline-flex lg:hidden" },
14037
- xl: { show: "hidden xl:inline-flex", hide: "inline-flex xl:hidden" },
14038
- "2xl": { show: "hidden 2xl:inline-flex", hide: "inline-flex 2xl:hidden" }
14039
- };
14040
- function EntityListTopCellSmart({
14041
- long,
14042
- short,
14043
- tooltip,
14044
- breakpoint = "2xl",
14045
- className
14046
- }) {
14047
- const tooltipText = tooltip ?? (typeof long === "string" ? long : void 0);
14048
- const bp = breakpointClasses[breakpoint];
14049
- const content = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
14050
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("items-center gap-1", bp.show), children: long }),
14051
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("items-center gap-1", bp.hide), children: short })
14052
- ] });
14053
- if (tooltipText) {
14054
- return /* @__PURE__ */ jsxRuntime.jsx(
14055
- EntityListTopCellWithTooltip,
14056
- {
14057
- tooltip: tooltipText,
14058
- className: cn("flex [&_svg]:w-[1.3em] [&_svg]:h-[1.3em]", className),
14059
- children: content
14060
- }
14061
- );
14062
- }
14063
- return /* @__PURE__ */ jsxRuntime.jsx(EntityListTopCell, { className: cn("flex [&_svg]:w-[1.3em] [&_svg]:h-[1.3em]", className), children: content });
14064
- }
14065
-
14066
- const EntityList = Object.assign(EntityListRoot, {
14067
- Top: EntityListTop,
14068
- TopCell: EntityListTopCell,
14069
- TopCellWithTooltip: EntityListTopCellWithTooltip,
14070
- TopCellSmart: EntityListTopCellSmart,
14071
- Rows: EntityListRows,
14072
- Row: EntityListRow,
14073
- RowLink: EntityListRowLink,
14074
- Cell: EntityListCell,
14075
- TextCell: EntityListTextCell,
14076
- NameCell: EntityListNameCell,
14077
- DescriptionCell: EntityListDescriptionCell,
14078
- NoMatch: EntityListNoMatch,
14079
- Pagination: EntityListPagination
14080
- });
14081
-
14082
- const widths = ["75%", "50%", "65%", "90%", "60%", "80%"];
14083
- function EntityListSkeleton({ columns, numberOfRows = 3 }) {
14084
- const columnParts = columns.trim().split(/\s+/);
14085
- const columnCount = columnParts.length;
14086
- const skeletonColumns = columnParts.map((col) => col === "auto" ? "minmax(6rem, auto)" : col).join(" ");
14087
- const getPseudoRandomWidth = (rowIdx, colIdx) => {
14088
- const index = (rowIdx + colIdx + columnCount + numberOfRows) % widths.length;
14089
- return widths[index];
14090
- };
14091
- return /* @__PURE__ */ jsxRuntime.jsx(EntityListRoot, { columns: skeletonColumns, children: Array.from({ length: numberOfRows }).map((_, rowIdx) => /* @__PURE__ */ jsxRuntime.jsx(
14092
- "div",
14093
- {
14094
- className: "entity-list-row grid grid-cols-subgrid gap-6 lg:gap-8 xl:gap-10 2xl:gap-12 3xl:gap-14 col-span-full px-5 border-y border-b-border1 border-t-transparent transition-colors duration-200 rounded-lg",
14095
- children: Array.from({ length: columnCount }).map((_2, colIdx) => /* @__PURE__ */ jsxRuntime.jsx(EntityListCell, { children: /* @__PURE__ */ jsxRuntime.jsx(
14096
- "div",
14097
- {
14098
- className: "bg-surface4 rounded-md animate-pulse text-transparent h-4 select-none",
14099
- style: { width: getPseudoRandomWidth(rowIdx, colIdx) }
14100
- }
14101
- ) }, colIdx))
14102
- },
14103
- rowIdx
14104
- )) });
14105
- }
14106
-
14107
13892
  const LEVEL_CONFIG = {
14108
13893
  debug: { label: "DEBUG", color: "#71717a" },
14109
13894
  info: { label: "INFO", color: "#60a5fa" },
@@ -14172,31 +13957,6 @@ const LogsDataList = Object.assign(DataListRoot, {
14172
13957
  NextPageLoading: DataListNextPageLoading
14173
13958
  });
14174
13959
 
14175
- function EntityListPageLayoutRoot({ children, className }) {
14176
- const pageHeading = usePageHeading();
14177
- return /* @__PURE__ */ jsxRuntime.jsxs(
14178
- "main",
14179
- {
14180
- className: cn(
14181
- "w-full h-full overflow-hidden grid grid-rows-[auto_auto] max-w-[110rem] px-10 mx-auto gap-4 py-6 content-start",
14182
- className
14183
- ),
14184
- children: [
14185
- pageHeading && /* @__PURE__ */ jsxRuntime.jsx("h1", { className: "sr-only", children: pageHeading }),
14186
- children
14187
- ]
14188
- }
14189
- );
14190
- }
14191
-
14192
- function EntityListPageLayoutTop({ children, className }) {
14193
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("grid gap-4", className), children });
14194
- }
14195
-
14196
- const EntityListPageLayout = Object.assign(EntityListPageLayoutRoot, {
14197
- Top: EntityListPageLayoutTop
14198
- });
14199
-
14200
13960
  function PageLayoutColumn({ children, className }) {
14201
13961
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("grid content-start", className), children });
14202
13962
  }
@@ -22473,9 +22233,6 @@ exports.EntityContent = EntityContent;
22473
22233
  exports.EntityDescription = EntityDescription;
22474
22234
  exports.EntityHeader = EntityHeader;
22475
22235
  exports.EntityIcon = EntityIcon;
22476
- exports.EntityList = EntityList;
22477
- exports.EntityListPageLayout = EntityListPageLayout;
22478
- exports.EntityListSkeleton = EntityListSkeleton;
22479
22236
  exports.EntityName = EntityName;
22480
22237
  exports.Entry = Entry;
22481
22238
  exports.EntryCell = EntryCell;