@mastra/playground-ui 22.2.0-alpha.8 → 23.0.0-alpha.10

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,57 @@
1
1
  # @mastra/playground-ui
2
2
 
3
+ ## 23.0.0-alpha.10
4
+
5
+ ### Minor Changes
6
+
7
+ - Added `ErrorBoundary` component to catch and display runtime errors in the studio. Wraps routes in the local playground so a crash on one page (e.g. an agent editor referencing an unresolved workspace skill) surfaces a friendly recovery UI with **Try again** (in-place React reset), **Reload page** (full browser refresh), and **Report issue** (opens the Mastra GitHub issues page in a new tab) actions, plus a collapsible stack trace — instead of a blank screen. ([#15561](https://github.com/mastra-ai/mastra/pull/15561))
8
+
9
+ The fallback is spatially aware: it fills its parent and the icon, heading, and body text scale up on wider containers via Tailwind container queries. Scope the boundary to a single widget to keep the rest of the UI interactive while one panel fails.
10
+
11
+ **Usage**
12
+
13
+ ```tsx
14
+ import { ErrorBoundary } from '@mastra/playground-ui';
15
+ import { useLocation } from 'react-router';
16
+
17
+ // Route-level: wrap the router outlet, reset when the path changes
18
+ function Layout({ children }) {
19
+ const { pathname } = useLocation();
20
+ return <ErrorBoundary resetKeys={[pathname]}>{children}</ErrorBoundary>;
21
+ }
22
+
23
+ // Scoped: contain the crash to one panel, leave the rest of the tree alone
24
+ <ErrorBoundary variant="inline" title="The editor failed to render">
25
+ <AgentEditor />
26
+ </ErrorBoundary>;
27
+ ```
28
+
29
+ Props: `fallback` (node or render prop with `{ error, errorInfo, reset }`), `onError` for reporting, `resetKeys` for automatic reset, `variant` (`'section'` — fills available space, default; `'inline'` — stays compact), and `title` / `description` overrides.
30
+
31
+ ### Patch Changes
32
+
33
+ - Align BrandLoader geometry with the Mastra logo: match disk positions to the logo path, introduce per-size stroke widths and bubble radii (sm/md/lg), and rebalance the gooey filter for rounder ridge↔disk fillets. Shift the size scale so sm stays, md is now w-8, lg is now w-10, and the old w-16 size is removed. ([#15531](https://github.com/mastra-ai/mastra/pull/15531))
34
+
35
+ - Updated dependencies [[`aba393e`](https://github.com/mastra-ai/mastra/commit/aba393e2da7390c69b80e516a4f153cda6f09376), [`0a5fa1d`](https://github.com/mastra-ai/mastra/commit/0a5fa1d3cb0583889d06687155f26fd7d2edc76c), [`ea43e64`](https://github.com/mastra-ai/mastra/commit/ea43e646dd95d507694b6112b0bf1df22ad552b2), [`00d1b16`](https://github.com/mastra-ai/mastra/commit/00d1b16b401199cb294fa23f43336547db4dca9b), [`af8a57e`](https://github.com/mastra-ai/mastra/commit/af8a57ed9ba9685ad8601d5b71ae3706da6222f9), [`be49755`](https://github.com/mastra-ai/mastra/commit/be4975575e63b38f63af588ea8ce6f4cf5b8ff2c)]:
36
+ - @mastra/core@1.26.0-alpha.10
37
+ - @mastra/client-js@1.14.0-alpha.10
38
+ - @mastra/react@0.2.27-alpha.10
39
+
40
+ ## 22.2.0-alpha.9
41
+
42
+ ### Minor Changes
43
+
44
+ - Added new Logo component to the playground-ui design system. Supports two sizes (sm, md), uses currentColor for theming, and includes an optional outline-on-hover animation that respects prefers-reduced-motion. ([#15513](https://github.com/mastra-ai/mastra/pull/15513))
45
+
46
+ ### Patch Changes
47
+
48
+ - dependencies updates: ([#15525](https://github.com/mastra-ai/mastra/pull/15525))
49
+ - Updated dependency [`prettier@^3.8.3` ↗︎](https://www.npmjs.com/package/prettier/v/3.8.3) (from `^3.8.1`, in `dependencies`)
50
+ - Updated dependencies [[`16e34ca`](https://github.com/mastra-ai/mastra/commit/16e34caa98b9a114b17a6125e4e3fd87f169d0d0)]:
51
+ - @mastra/core@1.26.0-alpha.9
52
+ - @mastra/client-js@1.13.5-alpha.9
53
+ - @mastra/react@0.2.27-alpha.9
54
+
3
55
  ## 22.2.0-alpha.8
4
56
 
5
57
  ### Patch Changes
package/dist/index.cjs.js CHANGED
@@ -3386,7 +3386,7 @@ function cn(...inputs) {
3386
3386
  return twMerge(clsx(inputs));
3387
3387
  }
3388
3388
 
3389
- const sizeClasses$5 = {
3389
+ const sizeClasses$6 = {
3390
3390
  sm: `${formElementSizes.sm} text-ui-sm px-[.75em]`,
3391
3391
  md: `${formElementSizes.md} text-ui-md px-[.75em]`,
3392
3392
  default: `${formElementSizes.default} text-ui-md px-[.85em] `,
@@ -3419,7 +3419,7 @@ function resolveVariant(variant) {
3419
3419
  function buttonVariants(options) {
3420
3420
  const variant = resolveVariant(options?.variant || "default");
3421
3421
  const size = options?.size || "default";
3422
- return cn(sharedStyles, sizeClasses$5[size], variantClasses$4[variant], options?.iconOnly && "[&>svg]:opacity-75");
3422
+ return cn(sharedStyles, sizeClasses$6[size], variantClasses$4[variant], options?.iconOnly && "[&>svg]:opacity-75");
3423
3423
  }
3424
3424
  function flattenChildren(children) {
3425
3425
  const result = [];
@@ -4797,7 +4797,7 @@ const AlertDescription = ({ children, as: As = "p" }) => {
4797
4797
  return /* @__PURE__ */ jsxRuntime.jsx(Txt, { as: As, variant: "ui-sm", children });
4798
4798
  };
4799
4799
 
4800
- const sizeClasses$4 = {
4800
+ const sizeClasses$5 = {
4801
4801
  sm: "h-avatar-sm w-avatar-sm",
4802
4802
  md: "h-avatar-md w-avatar-md",
4803
4803
  lg: "h-avatar-lg w-avatar-lg"
@@ -4807,7 +4807,7 @@ const Avatar = ({ src, name, size = "sm", interactive = false }) => {
4807
4807
  "div",
4808
4808
  {
4809
4809
  className: cn(
4810
- sizeClasses$4[size],
4810
+ sizeClasses$5[size],
4811
4811
  "border border-border1 bg-surface3 shrink-0 overflow-hidden rounded-full flex items-center justify-center",
4812
4812
  transitions.all,
4813
4813
  interactive && "cursor-pointer hover:scale-105 hover:border-neutral2 hover:shadow-sm"
@@ -5622,6 +5622,59 @@ const LogoWithoutText = (props) => /* @__PURE__ */ jsxRuntime.jsx("svg", { xmlns
5622
5622
  }
5623
5623
  ) });
5624
5624
 
5625
+ const PATH_D = "M4.49805 11.6934C6.98237 11.6934 8.99609 13.7081 8.99609 16.1924C8.9959 18.6765 6.98225 20.6904 4.49805 20.6904C2.01394 20.6903 0.000196352 18.6765 0 16.1924C0 13.7081 2.01382 11.6935 4.49805 11.6934ZM10.3867 0C12.8709 0 14.8846 2.01388 14.8848 4.49805C14.8848 4.8377 14.847 5.16846 14.7755 5.48643C14.4618 6.88139 14.1953 8.4633 14.9928 9.65L16.2575 11.5319C16.3363 11.6491 16.4727 11.7115 16.6137 11.703C16.7369 11.6957 16.8525 11.6343 16.9214 11.5318L18.1876 9.64717C18.9772 8.47198 18.7236 6.90783 18.4205 5.52484C18.3523 5.21392 18.3164 4.89094 18.3164 4.55957C18.3167 2.07546 20.3313 0.0615234 22.8154 0.0615234C25.2994 0.0617476 27.3132 2.0756 27.3135 4.55957C27.3135 4.93883 27.2665 5.30712 27.178 5.65896C26.8547 6.94441 26.5817 8.37932 27.2446 9.52714L28.459 11.6301C28.4819 11.6697 28.5245 11.6934 28.5703 11.6934C31.0545 11.6935 33.0684 13.7081 33.0684 16.1924C33.0682 18.6765 31.0544 20.6903 28.5703 20.6904C26.0861 20.6904 24.0725 18.6765 24.0723 16.1924C24.0723 15.8049 24.1212 15.4288 24.2133 15.0701C24.5458 13.7746 24.8298 12.3251 24.1609 11.1668L23.0044 9.16384C22.9656 9.09659 22.8931 9.05859 22.8154 9.05859C22.7983 9.05859 22.7824 9.06614 22.7728 9.08033L21.4896 10.9895C20.686 12.1851 20.9622 13.781 21.284 15.1851C21.3582 15.5089 21.3975 15.8461 21.3975 16.1924C21.3973 18.6764 19.3834 20.6902 16.8994 20.6904C14.4152 20.6904 12.4006 18.6765 12.4004 16.1924C12.4004 15.932 12.4226 15.6768 12.4651 15.4286C12.6859 14.14 12.8459 12.7122 12.1167 11.6271L11.2419 10.3253C10.6829 9.49347 9.71913 9.05932 8.78286 8.70188C7.0906 8.05584 5.88867 6.41734 5.88867 4.49805C5.88886 2.0139 7.90254 3.29835e-05 10.3867 0Z";
5626
+ const sizeClasses$4 = {
5627
+ sm: "w-6",
5628
+ md: "w-10"
5629
+ };
5630
+ function prefersReducedMotion() {
5631
+ if (typeof window === "undefined" || !window.matchMedia) return false;
5632
+ return window.matchMedia("(prefers-reduced-motion: reduce)").matches;
5633
+ }
5634
+ function Logo({ className, size = "md", animateOnHover = false, "aria-label": ariaLabel = "Mastra" }) {
5635
+ const reactId = React.useId();
5636
+ const clipId = `logo-clip-${reactId.replace(/[^a-zA-Z0-9_-]/g, "")}`;
5637
+ const [playing, setPlaying] = React.useState(false);
5638
+ const handleMouseEnter = animateOnHover ? () => {
5639
+ if (prefersReducedMotion()) return;
5640
+ setPlaying(true);
5641
+ } : void 0;
5642
+ const handleAnimationEnd = animateOnHover && playing ? (e) => {
5643
+ if (e.animationName !== "logo-stroke-cycle") return;
5644
+ setPlaying(false);
5645
+ } : void 0;
5646
+ return /* @__PURE__ */ jsxRuntime.jsx(
5647
+ "div",
5648
+ {
5649
+ role: "img",
5650
+ "aria-label": ariaLabel,
5651
+ onMouseEnter: handleMouseEnter,
5652
+ onAnimationEnd: handleAnimationEnd,
5653
+ className: cn(
5654
+ "logo inline-block text-neutral6",
5655
+ sizeClasses$4[size],
5656
+ animateOnHover && playing && "logo-animate-on-hover",
5657
+ className
5658
+ ),
5659
+ children: /* @__PURE__ */ jsxRuntime.jsxs(
5660
+ "svg",
5661
+ {
5662
+ xmlns: "http://www.w3.org/2000/svg",
5663
+ viewBox: "0 0 34 21",
5664
+ fill: "none",
5665
+ className: "logo-svg block w-full h-auto",
5666
+ "aria-hidden": "true",
5667
+ children: [
5668
+ /* @__PURE__ */ jsxRuntime.jsx("defs", { children: /* @__PURE__ */ jsxRuntime.jsx("clipPath", { id: clipId, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: PATH_D }) }) }),
5669
+ /* @__PURE__ */ jsxRuntime.jsx("path", { className: "logo-fill", d: PATH_D }),
5670
+ /* @__PURE__ */ jsxRuntime.jsx("path", { className: "logo-stroke", d: PATH_D, clipPath: `url(#${clipId})` })
5671
+ ]
5672
+ }
5673
+ )
5674
+ }
5675
+ );
5676
+ }
5677
+
5625
5678
  const rowSize = {
5626
5679
  default: "[&>tbody>tr]:h-table-row",
5627
5680
  small: "[&>tbody>tr]:h-table-row-small"
@@ -7663,43 +7716,46 @@ Slider.displayName = SliderPrimitive__namespace.Root.displayName;
7663
7716
 
7664
7717
  const sizeClasses$1 = {
7665
7718
  sm: "w-6",
7666
- md: "w-10",
7667
- lg: "w-16"
7719
+ md: "w-8",
7720
+ lg: "w-10"
7721
+ };
7722
+ const strokeBySize = {
7723
+ sm: 2.2,
7724
+ md: 2.5,
7725
+ lg: 2.9
7726
+ };
7727
+ const bubbleBySize = {
7728
+ sm: 4.3,
7729
+ md: 4.4,
7730
+ lg: 4.498
7668
7731
  };
7669
7732
  function BrandLoader({ className, size = "md", "aria-label": ariaLabel = "Loading" }) {
7670
7733
  const reactId = React.useId();
7671
7734
  const filterId = `brand-loader-${reactId.replace(/[^a-zA-Z0-9_-]/g, "")}`;
7735
+ const r = bubbleBySize[size];
7672
7736
  return /* @__PURE__ */ jsxRuntime.jsx(
7673
7737
  "div",
7674
7738
  {
7675
7739
  role: "status",
7676
7740
  "aria-label": ariaLabel,
7677
7741
  className: cn("brand-loader inline-block text-neutral6", sizeClasses$1[size], className),
7678
- children: /* @__PURE__ */ jsxRuntime.jsxs(
7679
- "svg",
7680
- {
7681
- xmlns: "http://www.w3.org/2000/svg",
7682
- viewBox: "0 0 34 21",
7683
- className: "block w-full h-auto overflow-visible",
7684
- "aria-hidden": "true",
7685
- children: [
7686
- /* @__PURE__ */ jsxRuntime.jsx("defs", { children: /* @__PURE__ */ jsxRuntime.jsxs("filter", { id: filterId, children: [
7687
- /* @__PURE__ */ jsxRuntime.jsx("feGaussianBlur", { in: "SourceGraphic", stdDeviation: "0.55" }),
7688
- /* @__PURE__ */ jsxRuntime.jsx("feColorMatrix", { values: "1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 18 -7" })
7689
- ] }) }),
7690
- /* @__PURE__ */ jsxRuntime.jsxs("g", { filter: `url(#${filterId})`, children: [
7691
- /* @__PURE__ */ jsxRuntime.jsx("line", { className: "brand-loader-ln23", x1: "10.4", y1: "4.5", x2: "16.8", y2: "16.2" }),
7692
- /* @__PURE__ */ jsxRuntime.jsx("line", { className: "brand-loader-ln34", x1: "16.8", y1: "16.2", x2: "23.2", y2: "4.5" }),
7693
- /* @__PURE__ */ jsxRuntime.jsx("line", { className: "brand-loader-ln45", x1: "23.2", y1: "4.5", x2: "29.5", y2: "16.2" }),
7694
- /* @__PURE__ */ jsxRuntime.jsx("circle", { className: "brand-loader-b1", cx: "4.5", cy: "16.2", r: "4.5" }),
7695
- /* @__PURE__ */ jsxRuntime.jsx("circle", { className: "brand-loader-b2", cx: "10.4", cy: "4.5", r: "4.5" }),
7696
- /* @__PURE__ */ jsxRuntime.jsx("circle", { className: "brand-loader-b3", cx: "16.8", cy: "16.2", r: "4.5" }),
7697
- /* @__PURE__ */ jsxRuntime.jsx("circle", { className: "brand-loader-b4", cx: "23.2", cy: "4.5", r: "4.5" }),
7698
- /* @__PURE__ */ jsxRuntime.jsx("circle", { className: "brand-loader-b5", cx: "29.5", cy: "16.2", r: "4.5" })
7699
- ] })
7700
- ]
7701
- }
7702
- )
7742
+ style: { ["--brand-loader-stroke"]: strokeBySize[size] },
7743
+ children: /* @__PURE__ */ jsxRuntime.jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 34 21", "aria-hidden": "true", children: [
7744
+ /* @__PURE__ */ jsxRuntime.jsx("defs", { children: /* @__PURE__ */ jsxRuntime.jsxs("filter", { id: filterId, x: "-5%", y: "-5%", width: "110%", height: "110%", children: [
7745
+ /* @__PURE__ */ jsxRuntime.jsx("feGaussianBlur", { in: "SourceGraphic", stdDeviation: "0.9" }),
7746
+ /* @__PURE__ */ jsxRuntime.jsx("feColorMatrix", { values: "1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 11 -4.3" })
7747
+ ] }) }),
7748
+ /* @__PURE__ */ jsxRuntime.jsxs("g", { filter: `url(#${filterId})`, children: [
7749
+ /* @__PURE__ */ jsxRuntime.jsx("line", { className: "brand-loader-ln23", x1: "10.387", y1: "4.498", x2: "16.899", y2: "16.192" }),
7750
+ /* @__PURE__ */ jsxRuntime.jsx("line", { className: "brand-loader-ln34", x1: "16.899", y1: "16.192", x2: "22.815", y2: "4.56" }),
7751
+ /* @__PURE__ */ jsxRuntime.jsx("line", { className: "brand-loader-ln45", x1: "22.815", y1: "4.56", x2: "28.57", y2: "16.192" }),
7752
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { className: "brand-loader-b1", cx: "4.498", cy: "16.192", r }),
7753
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { className: "brand-loader-b2", cx: "10.387", cy: "4.498", r }),
7754
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { className: "brand-loader-b3", cx: "16.899", cy: "16.192", r }),
7755
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { className: "brand-loader-b4", cx: "22.815", cy: "4.56", r }),
7756
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { className: "brand-loader-b5", cx: "28.57", cy: "16.192", r })
7757
+ ] })
7758
+ ] })
7703
7759
  }
7704
7760
  );
7705
7761
  }
@@ -11950,6 +12006,152 @@ const ListSearch = ({
11950
12006
  );
11951
12007
  };
11952
12008
 
12009
+ const INITIAL_STATE = { error: null, errorInfo: null };
12010
+ function keysChanged(prev, next) {
12011
+ if (prev === next) return false;
12012
+ if (!prev || !next) return true;
12013
+ if (prev.length !== next.length) return true;
12014
+ for (let i = 0; i < prev.length; i++) {
12015
+ if (!Object.is(prev[i], next[i])) return true;
12016
+ }
12017
+ return false;
12018
+ }
12019
+ class ErrorBoundary extends React__namespace.Component {
12020
+ state = INITIAL_STATE;
12021
+ static getDerivedStateFromError(error) {
12022
+ return { error };
12023
+ }
12024
+ componentDidCatch(error, errorInfo) {
12025
+ this.setState({ errorInfo });
12026
+ if (this.props.onError) {
12027
+ try {
12028
+ this.props.onError(error, errorInfo);
12029
+ } catch (handlerError) {
12030
+ if (typeof console !== "undefined") {
12031
+ console.error("[ErrorBoundary] onError handler threw:", handlerError);
12032
+ }
12033
+ }
12034
+ }
12035
+ if (typeof console !== "undefined") {
12036
+ console.error("[ErrorBoundary] Uncaught error:", error, errorInfo);
12037
+ }
12038
+ }
12039
+ componentDidUpdate(prevProps) {
12040
+ if (this.state.error && keysChanged(prevProps.resetKeys, this.props.resetKeys)) {
12041
+ this.reset();
12042
+ }
12043
+ }
12044
+ reset = () => {
12045
+ this.setState(INITIAL_STATE);
12046
+ };
12047
+ render() {
12048
+ const { error, errorInfo } = this.state;
12049
+ const { children, fallback, title, description, variant, className } = this.props;
12050
+ if (!error) return children;
12051
+ if (typeof fallback === "function") {
12052
+ return fallback({ error, errorInfo, reset: this.reset });
12053
+ }
12054
+ if (fallback !== void 0) return fallback;
12055
+ return /* @__PURE__ */ jsxRuntime.jsx(
12056
+ DefaultErrorFallback,
12057
+ {
12058
+ error,
12059
+ errorInfo,
12060
+ reset: this.reset,
12061
+ title,
12062
+ description,
12063
+ variant: variant ?? "section",
12064
+ className
12065
+ }
12066
+ );
12067
+ }
12068
+ }
12069
+ function DefaultErrorFallback({
12070
+ error,
12071
+ errorInfo,
12072
+ reset,
12073
+ title,
12074
+ description,
12075
+ variant,
12076
+ className
12077
+ }) {
12078
+ const stack = errorInfo?.componentStack ?? error.stack ?? "";
12079
+ const isInline = variant === "inline";
12080
+ return /* @__PURE__ */ jsxRuntime.jsx(
12081
+ "div",
12082
+ {
12083
+ role: "alert",
12084
+ className: cn(
12085
+ "@container flex w-full items-center justify-center",
12086
+ isInline ? "py-6 px-4" : "h-full min-h-[240px] flex-1 py-10 px-6",
12087
+ className
12088
+ ),
12089
+ children: /* @__PURE__ */ jsxRuntime.jsxs(
12090
+ "div",
12091
+ {
12092
+ className: cn(
12093
+ "flex flex-col items-center text-center",
12094
+ isInline ? "gap-3 max-w-md" : "gap-4 max-w-2xl @md:gap-5 @lg:gap-6"
12095
+ ),
12096
+ children: [
12097
+ /* @__PURE__ */ jsxRuntime.jsx(
12098
+ "div",
12099
+ {
12100
+ className: cn(
12101
+ "rounded-full bg-accent2/10 text-accent2 flex items-center justify-center",
12102
+ isInline ? "h-10 w-10 [&>svg]:h-5 [&>svg]:w-5" : "h-14 w-14 [&>svg]:h-7 [&>svg]:w-7 @md:h-16 @md:w-16 @md:[&>svg]:h-8 @md:[&>svg]:w-8 @lg:h-20 @lg:w-20 @lg:[&>svg]:h-10 @lg:[&>svg]:w-10"
12103
+ ),
12104
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.AlertTriangle, {})
12105
+ }
12106
+ ),
12107
+ /* @__PURE__ */ jsxRuntime.jsx(
12108
+ "h3",
12109
+ {
12110
+ className: cn(
12111
+ "font-medium text-neutral6",
12112
+ isInline ? "text-ui-md" : "text-ui-lg @md:text-header-md @lg:text-header-lg"
12113
+ ),
12114
+ children: title ?? "Something went wrong"
12115
+ }
12116
+ ),
12117
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("text-neutral3", isInline ? "text-ui-sm" : "text-ui-md @lg:text-ui-lg"), children: description ?? "An unexpected error occurred while rendering this part of the page." }),
12118
+ /* @__PURE__ */ jsxRuntime.jsx(
12119
+ "p",
12120
+ {
12121
+ className: cn(
12122
+ "font-mono text-neutral4 break-words rounded-md bg-surface3 px-3 py-2",
12123
+ isInline ? "text-ui-xs" : "text-ui-sm"
12124
+ ),
12125
+ children: error.message
12126
+ }
12127
+ ),
12128
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-wrap items-center justify-center gap-2", isInline ? "mt-1" : "mt-2"), children: [
12129
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "primary", size: isInline ? "sm" : "default", onClick: reset, children: "Try again" }),
12130
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "default", size: isInline ? "sm" : "default", onClick: () => window.location.reload(), children: "Reload page" }),
12131
+ /* @__PURE__ */ jsxRuntime.jsx(
12132
+ Button,
12133
+ {
12134
+ as: "a",
12135
+ variant: "default",
12136
+ size: isInline ? "sm" : "default",
12137
+ href: "https://github.com/mastra-ai/mastra/issues",
12138
+ target: "_blank",
12139
+ rel: "noopener noreferrer",
12140
+ children: "Report issue"
12141
+ }
12142
+ )
12143
+ ] }),
12144
+ stack ? /* @__PURE__ */ jsxRuntime.jsxs("details", { className: cn("w-full text-left", isInline ? "mt-1" : "mt-2"), children: [
12145
+ /* @__PURE__ */ jsxRuntime.jsx("summary", { className: "cursor-pointer text-ui-sm text-neutral3 hover:text-neutral4", children: "Show error details" }),
12146
+ /* @__PURE__ */ jsxRuntime.jsx("pre", { className: "mt-2 max-h-64 overflow-auto rounded-md bg-surface3 p-3 text-ui-xs text-neutral4 whitespace-pre-wrap break-words", children: stack })
12147
+ ] }) : null
12148
+ ]
12149
+ }
12150
+ )
12151
+ }
12152
+ );
12153
+ }
12154
+
11953
12155
  function ErrorState({ title, message }) {
11954
12156
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-center h-[30vh]", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center justify-center text-center py-10 px-6", children: [
11955
12157
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-4", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CircleXIcon, { className: "h-8 w-8 text-red-900" }) }),
@@ -14303,6 +14505,7 @@ exports.EntryCell = EntryCell;
14303
14505
  exports.EntryList = EntryList;
14304
14506
  exports.EntryListSkeleton = EntryListSkeleton;
14305
14507
  exports.EnvIcon = EnvIcon;
14508
+ exports.ErrorBoundary = ErrorBoundary;
14306
14509
  exports.ErrorState = ErrorState;
14307
14510
  exports.Field = Field;
14308
14511
  exports.FieldBlock = FieldBlock;
@@ -14340,6 +14543,7 @@ exports.KeyValueList = KeyValueList;
14340
14543
  exports.Label = Label;
14341
14544
  exports.LatencyIcon = LatencyIcon;
14342
14545
  exports.ListSearch = ListSearch;
14546
+ exports.Logo = Logo;
14343
14547
  exports.LogoWithoutText = LogoWithoutText;
14344
14548
  exports.LogsDataList = LogsDataList;
14345
14549
  exports.LogsDataListSkeleton = DataListSkeleton;