@tangle-network/sandbox-ui 0.121.1 → 0.122.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/pages.d.ts CHANGED
@@ -314,16 +314,9 @@ interface SecretsPageProps {
314
314
  * edge-to-edge list that scrolls inside the available height.
315
315
  */
316
316
  variant?: "page" | "pane";
317
- /**
318
- * Optional hint pointing users at team-level secrets. When provided,
319
- * renders a persistent informational banner below the header clarifying
320
- * that personal secrets are NOT shared with teams and linking the
321
- * user to their team-management page to configure shared secrets
322
- * there. Omit entirely to hide the banner (e.g. in deployments
323
- * without teams).
324
- */
317
+ /** Optional navigation to team-scoped credentials, shown beside the page actions. */
325
318
  teamSecretsHint?: {
326
- /** Callback fired when the user clicks the banner's CTA. */
319
+ /** Navigate to team-scoped credentials. */
327
320
  onNavigate: () => void;
328
321
  /** CTA label. Defaults to "Manage team secrets". */
329
322
  label?: string;
package/dist/pages.js CHANGED
@@ -1,12 +1,12 @@
1
- import { $ as Select$1, C as DialogTitle$1, G as Input$1, Nt as Textarea$1, Y as PageHeader$1, _ as DialogContent$1, a as Badge$1, b as DialogHeader$1, ct as SelectValue$1, et as SelectContent$1, h as Dialog$1, ht as Switch, nt as SelectItem$1, o as Button$1, st as SelectTrigger$1, v as DialogDescription$1, y as DialogFooter$1 } from "./primitives-BQGtwZX3.js";
1
+ import { $ as Select$1, C as DialogTitle$1, G as Input$1, Nt as Textarea$1, _ as DialogContent$1, a as Badge$1, b as DialogHeader$1, ct as SelectValue$1, et as SelectContent$1, h as Dialog$1, ht as Switch, nt as SelectItem$1, o as Button$1, st as SelectTrigger$1, v as DialogDescription$1, y as DialogFooter$1 } from "./primitives-C4qn9fZ8.js";
2
2
  import { t as cn$1 } from "./utils-DzWbktWG.js";
3
- import { i as PricingPage, n as TemplateCard, o as BillingDashboard, r as UsageChart, t as InfoPanel } from "./info-panel-C9cqDzOL.js";
3
+ import { a as PricingPage, i as UsageChart, r as TemplateCard, s as BillingDashboard, t as DashboardPageHeader } from "./page-layout-Cf90DTWr.js";
4
4
  import { Badge, Button, Card, Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, EmptyState, Input, Skeleton, SkeletonCard, Tabs, TabsContent, TabsList, TabsTrigger } from "@tangle-network/ui/primitives";
5
5
  import { Logo, TangleKnot } from "@tangle-network/brand";
6
6
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
7
7
  import * as React$1 from "react";
8
8
  import { useState } from "react";
9
- import { AlertCircle, ArrowLeft, ArrowRight, Check, CheckCircle, ChevronDown, ChevronRight, ChevronUp, Clock, Copy, Cpu, Edit2, Eye, EyeOff, GripVertical, Info, Key, Layers, Loader2, Lock, MemoryStick, Pencil, Play, Plus, Power, PowerOff, Search, Settings, Settings2, Shield, Terminal, Trash2, Upload, Users } from "lucide-react";
9
+ import { AlertCircle, ArrowLeft, Check, CheckCircle, ChevronDown, ChevronRight, ChevronUp, Clock, Copy, Cpu, Edit2, Eye, EyeOff, GripVertical, Info, Key, Layers, Loader2, Lock, MemoryStick, Pencil, Plus, Power, PowerOff, Search, Settings, Settings2, Terminal, Trash2, Upload } from "lucide-react";
10
10
  import { focusField, focusRing } from "@tangle-network/ui/utils";
11
11
  //#region src/pages/auth-page.tsx
12
12
  const C = {
@@ -339,7 +339,7 @@ async function fetchBillingDataFromApi(apiBasePath) {
339
339
  }
340
340
  function BillingPageSkeleton({ variant: _variant = "sandbox" }) {
341
341
  return /* @__PURE__ */ jsxs("div", {
342
- className: "space-y-8",
342
+ className: "w-full min-w-0 space-y-5",
343
343
  children: [/* @__PURE__ */ jsxs("div", {
344
344
  className: "grid gap-6 lg:grid-cols-3",
345
345
  children: [
@@ -500,13 +500,13 @@ function BillingPage({ variant = "sandbox", initialData, apiBasePath = "", onMan
500
500
  });
501
501
  const data = state.data || defaultBillingData;
502
502
  return /* @__PURE__ */ jsx("div", {
503
- className: "space-y-8",
503
+ className: "w-full min-w-0 space-y-5",
504
504
  children: /* @__PURE__ */ jsxs(Tabs, {
505
505
  defaultValue: "overview",
506
506
  className: "w-full",
507
507
  children: [
508
508
  /* @__PURE__ */ jsxs(TabsList, {
509
- className: "mb-6",
509
+ className: "mb-5 h-auto gap-1 rounded-xl border border-border bg-surface-container p-1.5 [&_[role=tab]]:min-h-11 [&_[role=tab]]:px-4 [&_[role=tab]]:text-sm [&_[role=tab][data-state=active]]:bg-[var(--accent-surface-strong)] [&_[role=tab][data-state=active]]:text-[var(--accent-text)] [&_[role=tab][data-state=active]]:shadow-sm",
510
510
  children: [
511
511
  /* @__PURE__ */ jsx(TabsTrigger, {
512
512
  value: "overview",
@@ -553,32 +553,25 @@ function BillingPage({ variant = "sandbox", initialData, apiBasePath = "", onMan
553
553
  title: "Credit Usage History",
554
554
  unit: "credits"
555
555
  }) : /* @__PURE__ */ jsxs("div", {
556
- className: "flex flex-col items-center justify-center rounded-xl border border-[var(--md3-outline-variant)] bg-surface-container p-12 text-center",
557
- children: [
558
- /* @__PURE__ */ jsxs("svg", {
559
- xmlns: "http://www.w3.org/2000/svg",
560
- viewBox: "0 0 24 24",
561
- fill: "none",
562
- stroke: "currentColor",
563
- strokeWidth: "2",
564
- strokeLinecap: "round",
565
- strokeLinejoin: "round",
566
- className: "mb-4 h-12 w-12 text-muted-foreground",
567
- children: [
568
- /* @__PURE__ */ jsx("title", { children: "No usage data icon" }),
569
- /* @__PURE__ */ jsx("path", { d: "M3 3v18h18" }),
570
- /* @__PURE__ */ jsx("path", { d: "m19 9-5 5-4-4-3 3" })
571
- ]
572
- }),
573
- /* @__PURE__ */ jsx("h3", {
574
- className: "font-semibold text-lg",
575
- children: "No usage data yet"
576
- }),
577
- /* @__PURE__ */ jsx("p", {
578
- className: "text-muted-foreground text-sm",
579
- children: "Start using credits to see your usage history here."
580
- })
581
- ]
556
+ className: "flex flex-col items-center justify-center rounded-xl border border-border bg-surface-container p-8 text-center",
557
+ children: [/* @__PURE__ */ jsxs("svg", {
558
+ xmlns: "http://www.w3.org/2000/svg",
559
+ viewBox: "0 0 24 24",
560
+ fill: "none",
561
+ stroke: "currentColor",
562
+ strokeWidth: "2",
563
+ strokeLinecap: "round",
564
+ strokeLinejoin: "round",
565
+ className: "mb-4 h-12 w-12 text-muted-foreground",
566
+ children: [
567
+ /* @__PURE__ */ jsx("title", { children: "No usage data icon" }),
568
+ /* @__PURE__ */ jsx("path", { d: "M3 3v18h18" }),
569
+ /* @__PURE__ */ jsx("path", { d: "m19 9-5 5-4-4-3 3" })
570
+ ]
571
+ }), /* @__PURE__ */ jsx("h3", {
572
+ className: "font-semibold text-lg",
573
+ children: "No usage data yet"
574
+ })]
582
575
  })
583
576
  })
584
577
  ]
@@ -2698,7 +2691,7 @@ function parseEnvText(text) {
2698
2691
  //#region src/pages/secrets-page.tsx
2699
2692
  /** Cap pasted/uploaded import sources so a pathological file cannot blow up the parser/UI. */
2700
2693
  const MAX_IMPORT_FILE_BYTES = 262144;
2701
- const DEFAULT_DESCRIPTION = "Secrets are securely stored and automatically exposed as environment variables across all your sandboxes.";
2694
+ const DEFAULT_DESCRIPTION = "Manage environment variables for your sandboxes.";
2702
2695
  const DEFAULT_CREATE_DESCRIPTION = "Secrets are automatically exposed as environment variables across all your new sandboxes.";
2703
2696
  const DEFAULT_EMPTY_DESCRIPTION = "Create a secret to inject into your sandboxes.";
2704
2697
  const DEFAULT_DELETE_CONSEQUENCE = "Sandboxes using this secret will lose access to it.";
@@ -2916,25 +2909,34 @@ function SecretsPage({ apiClient, className, teamSecretsHint, title = "Environme
2916
2909
  return dateStr;
2917
2910
  }
2918
2911
  };
2919
- const actions = /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs("button", {
2920
- type: "button",
2921
- onClick: () => setIsImportOpen(true),
2922
- className: "inline-flex items-center gap-1.5 whitespace-nowrap rounded-lg border border-[var(--md3-outline-variant)] bg-surface-container px-3 py-2 text-sm font-semibold text-foreground transition-colors hover:bg-surface-container-high active:scale-[0.97] sm:gap-2",
2923
- children: [/* @__PURE__ */ jsx(Upload, {
2924
- className: "h-4 w-4",
2925
- "aria-hidden": "true"
2926
- }), "Import .env"]
2927
- }), /* @__PURE__ */ jsxs("button", {
2928
- type: "button",
2929
- onClick: openCreate,
2930
- className: "inline-flex items-center gap-1.5 whitespace-nowrap rounded-lg border border-[var(--border-accent,transparent)] bg-[var(--btn-primary-bg)] px-3 py-2 text-sm font-semibold text-[var(--btn-primary-text)] transition-colors hover:bg-[var(--btn-primary-hover)] active:scale-[0.97] sm:gap-2 sm:px-4",
2931
- children: [/* @__PURE__ */ jsx(Plus, {
2932
- className: "h-4 w-4",
2933
- "aria-hidden": "true"
2934
- }), "New Secret"]
2935
- })] });
2912
+ const actions = /* @__PURE__ */ jsxs(Fragment, { children: [
2913
+ teamSecretsHint && /* @__PURE__ */ jsx("button", {
2914
+ type: "button",
2915
+ onClick: teamSecretsHint.onNavigate,
2916
+ className: "inline-flex min-h-11 items-center justify-center rounded-lg border border-border bg-surface-container-high px-3 text-sm font-medium text-foreground shadow-sm hover:bg-surface-container-highest",
2917
+ children: teamSecretsHint.label ?? "Team secrets"
2918
+ }),
2919
+ /* @__PURE__ */ jsxs("button", {
2920
+ type: "button",
2921
+ onClick: () => setIsImportOpen(true),
2922
+ className: "inline-flex items-center gap-1.5 whitespace-nowrap rounded-lg border border-[var(--md3-outline-variant)] bg-surface-container-high px-3 py-2 text-sm font-semibold text-foreground transition-colors hover:bg-surface-container-high active:scale-[0.97] sm:gap-2",
2923
+ children: [/* @__PURE__ */ jsx(Upload, {
2924
+ className: "h-4 w-4",
2925
+ "aria-hidden": "true"
2926
+ }), "Import .env"]
2927
+ }),
2928
+ /* @__PURE__ */ jsxs("button", {
2929
+ type: "button",
2930
+ onClick: openCreate,
2931
+ className: "inline-flex items-center gap-1.5 whitespace-nowrap rounded-lg border border-[var(--border-accent,transparent)] bg-[var(--btn-primary-bg)] px-3 py-2 text-sm font-semibold text-[var(--btn-primary-text)] transition-colors hover:bg-[var(--btn-primary-hover)] active:scale-[0.97] sm:gap-2 sm:px-4",
2932
+ children: [/* @__PURE__ */ jsx(Plus, {
2933
+ className: "h-4 w-4",
2934
+ "aria-hidden": "true"
2935
+ }), "New Secret"]
2936
+ })
2937
+ ] });
2936
2938
  return /* @__PURE__ */ jsxs("div", {
2937
- className: cn$1(pane ? "flex h-full min-h-0 w-full flex-col" : "mx-auto w-full max-w-6xl space-y-6", className),
2939
+ className: cn$1(pane ? "flex h-full min-h-0 w-full flex-col" : "w-full min-w-0 space-y-5", className),
2938
2940
  children: [
2939
2941
  pane ? /* @__PURE__ */ jsxs("header", {
2940
2942
  className: "flex shrink-0 flex-wrap items-center justify-between gap-x-6 gap-y-3 border-b border-border px-4 py-4 sm:px-6",
@@ -2951,41 +2953,10 @@ function SecretsPage({ apiClient, className, teamSecretsHint, title = "Environme
2951
2953
  className: "flex shrink-0 items-center gap-2",
2952
2954
  children: actions
2953
2955
  })]
2954
- }) : /* @__PURE__ */ jsx(PageHeader$1, {
2956
+ }) : /* @__PURE__ */ jsx(DashboardPageHeader, {
2955
2957
  title,
2956
2958
  description,
2957
- action: actions
2958
- }),
2959
- teamSecretsHint && /* @__PURE__ */ jsxs("div", {
2960
- className: cn$1("flex flex-wrap items-center gap-3 border-[var(--md3-outline-variant)] bg-[var(--accent-surface-soft)]/40 px-4 py-3", pane ? "shrink-0 border-b sm:px-6" : "rounded-lg border"),
2961
- children: [/* @__PURE__ */ jsxs("div", {
2962
- className: "flex min-w-[min(100%,18rem)] flex-1 items-start gap-3",
2963
- children: [/* @__PURE__ */ jsx(Users, {
2964
- className: "mt-0.5 h-5 w-5 shrink-0 text-[var(--accent-text)]",
2965
- "aria-hidden": "true"
2966
- }), /* @__PURE__ */ jsxs("div", {
2967
- className: "min-w-0 text-sm",
2968
- children: [/* @__PURE__ */ jsx("p", {
2969
- className: "font-semibold text-foreground",
2970
- children: "Setting up secrets for a team?"
2971
- }), /* @__PURE__ */ jsxs("p", {
2972
- className: "mt-0.5 text-xs text-muted-foreground",
2973
- children: [
2974
- "Secrets here are ",
2975
- /* @__PURE__ */ jsx("strong", { children: "personal" }),
2976
- " and only available in sandboxes you create. Add shared credentials on the team page."
2977
- ]
2978
- })]
2979
- })]
2980
- }), /* @__PURE__ */ jsxs("button", {
2981
- type: "button",
2982
- onClick: teamSecretsHint.onNavigate,
2983
- className: "inline-flex w-full shrink-0 items-center justify-center gap-1 rounded-md border border-[var(--md3-outline-variant)] bg-surface-container px-3 py-1.5 text-xs font-semibold text-foreground transition-colors hover:bg-surface-container-high sm:w-auto",
2984
- children: [teamSecretsHint.label ?? "Manage team secrets", /* @__PURE__ */ jsx(ArrowRight, {
2985
- className: "h-3 w-3",
2986
- "aria-hidden": "true"
2987
- })]
2988
- })]
2959
+ actions
2989
2960
  }),
2990
2961
  error && (secrets.length > 0 || loading) && /* @__PURE__ */ jsxs("div", {
2991
2962
  role: "alert",
@@ -3722,6 +3693,8 @@ function StartupScriptsPage({ apiClient, className }) {
3722
3693
  const [secrets, setSecrets] = React$1.useState([]);
3723
3694
  const [environments, setEnvironments] = React$1.useState([]);
3724
3695
  const [loading, setLoading] = React$1.useState(true);
3696
+ const [hasLoaded, setHasLoaded] = React$1.useState(false);
3697
+ const [loadError, setLoadError] = React$1.useState(null);
3725
3698
  const [error, setError] = React$1.useState(null);
3726
3699
  const [isDialogOpen, setIsDialogOpen] = React$1.useState(false);
3727
3700
  const [dialogStep, setDialogStep] = React$1.useState("picker");
@@ -3737,23 +3710,28 @@ function StartupScriptsPage({ apiClient, className }) {
3737
3710
  const apiRef = React$1.useRef(apiClient);
3738
3711
  apiRef.current = apiClient;
3739
3712
  const loadGenRef = React$1.useRef(0);
3740
- const loadData = React$1.useCallback(async (showSpinner = true) => {
3713
+ const loadData = React$1.useCallback(async () => {
3741
3714
  const gen = ++loadGenRef.current;
3715
+ setLoading(true);
3716
+ setLoadError(null);
3717
+ setError(null);
3742
3718
  try {
3743
- if (showSpinner) setLoading(true);
3744
- setError(null);
3745
- const [scriptData, secretData, envData] = await Promise.all([
3719
+ const [scriptResult, secretResult, envResult] = await Promise.allSettled([
3746
3720
  apiRef.current.listScripts(),
3747
3721
  apiRef.current.listSecrets?.() ?? Promise.resolve([]),
3748
3722
  apiRef.current.listEnvironments?.() ?? Promise.resolve([])
3749
3723
  ]);
3750
3724
  if (gen !== loadGenRef.current) return;
3751
- setScripts(scriptData);
3752
- setSecrets(secretData);
3753
- setEnvironments(envData);
3754
- } catch (err) {
3755
- if (gen !== loadGenRef.current) return;
3756
- setError(err instanceof Error ? err.message : "Failed to load startup scripts");
3725
+ if (scriptResult.status === "fulfilled") {
3726
+ setScripts(scriptResult.value);
3727
+ setHasLoaded(true);
3728
+ }
3729
+ if (secretResult.status === "fulfilled") setSecrets(secretResult.value);
3730
+ if (envResult.status === "fulfilled") setEnvironments(envResult.value);
3731
+ if (scriptResult.status === "rejected") setLoadError("Couldn't load startup scripts.");
3732
+ else if (secretResult.status === "rejected" || envResult.status === "rejected") setLoadError("Some script options couldn't load.");
3733
+ } catch {
3734
+ if (gen === loadGenRef.current) setLoadError("Couldn't load startup scripts.");
3757
3735
  } finally {
3758
3736
  if (gen === loadGenRef.current) setLoading(false);
3759
3737
  }
@@ -3823,7 +3801,7 @@ function StartupScriptsPage({ apiClient, className }) {
3823
3801
  if (editingScript) await apiRef.current.updateScript(editingScript.id, formData);
3824
3802
  else await apiRef.current.createScript(formData);
3825
3803
  setIsDialogOpen(false);
3826
- await loadData(false);
3804
+ await loadData();
3827
3805
  } catch (err) {
3828
3806
  setFormError(err instanceof Error ? err.message : "Failed to save script");
3829
3807
  } finally {
@@ -3833,7 +3811,7 @@ function StartupScriptsPage({ apiClient, className }) {
3833
3811
  const handleToggle = async (script) => {
3834
3812
  try {
3835
3813
  await apiRef.current.toggleScript(script.id);
3836
- await loadData(false);
3814
+ await loadData();
3837
3815
  } catch (err) {
3838
3816
  setError(err instanceof Error ? err.message : "Failed to toggle script");
3839
3817
  }
@@ -3844,7 +3822,7 @@ function StartupScriptsPage({ apiClient, className }) {
3844
3822
  try {
3845
3823
  await apiRef.current.deleteScript(deleteTarget.id);
3846
3824
  setDeleteTarget(null);
3847
- await loadData(false);
3825
+ await loadData();
3848
3826
  } catch (err) {
3849
3827
  setError(err instanceof Error ? err.message : "Failed to delete script");
3850
3828
  } finally {
@@ -3863,67 +3841,37 @@ function StartupScriptsPage({ apiClient, className }) {
3863
3841
  environments: prev.environments.includes(env) ? prev.environments.filter((e) => e !== env) : [...prev.environments, env]
3864
3842
  }));
3865
3843
  };
3866
- const activeCount = scripts.filter((s) => s.enabled).length;
3867
3844
  return /* @__PURE__ */ jsxs("div", {
3868
- className: cn$1("mx-auto w-full max-w-6xl space-y-8", className),
3845
+ className: cn$1("w-full min-w-0 space-y-5", className),
3869
3846
  children: [
3870
- /* @__PURE__ */ jsx(PageHeader$1, {
3847
+ /* @__PURE__ */ jsx(DashboardPageHeader, {
3871
3848
  title: "Startup Scripts",
3872
- description: "Define scripts that run automatically when your sandboxes start. Scripts can access your encrypted secrets.",
3873
- action: /* @__PURE__ */ jsxs("button", {
3849
+ description: "Run scripts when your sandboxes start.",
3850
+ actions: /* @__PURE__ */ jsxs("button", {
3874
3851
  type: "button",
3875
3852
  onClick: openCreate,
3876
3853
  className: "inline-flex items-center gap-2 rounded-lg bg-[var(--btn-primary-bg)] px-4 py-2.5 text-sm font-bold text-[var(--btn-primary-text)] shadow-sm transition-colors hover:bg-[var(--btn-primary-hover)]",
3877
3854
  children: [/* @__PURE__ */ jsx(Plus, { className: "h-4 w-4" }), "New Script"]
3878
3855
  })
3879
3856
  }),
3880
- /* @__PURE__ */ jsxs("div", {
3881
- className: "grid grid-cols-1 gap-6 md:grid-cols-4",
3857
+ (loadError || error) && /* @__PURE__ */ jsxs("div", {
3858
+ role: "alert",
3859
+ className: "flex flex-wrap items-center gap-3 rounded-lg border border-destructive/30 bg-destructive/10 p-4",
3882
3860
  children: [
3883
- /* @__PURE__ */ jsxs("div", {
3884
- className: "rounded-lg border border-[var(--md3-outline-variant)] bg-surface-container p-5 shadow-[var(--shadow-card)]",
3885
- children: [/* @__PURE__ */ jsx("p", {
3886
- className: "text-[10px] font-bold uppercase tracking-widest text-muted-foreground",
3887
- children: "Total Scripts"
3888
- }), /* @__PURE__ */ jsx("div", {
3889
- className: "mt-2 flex items-baseline gap-2",
3890
- children: /* @__PURE__ */ jsx("span", {
3891
- className: "font-display text-2xl font-extrabold text-foreground",
3892
- children: scripts.length
3893
- })
3894
- })]
3895
- }),
3896
- /* @__PURE__ */ jsxs("div", {
3897
- className: "rounded-lg border border-[var(--md3-outline-variant)] bg-surface-container p-5 shadow-[var(--shadow-card)]",
3898
- children: [/* @__PURE__ */ jsx("p", {
3899
- className: "text-[10px] font-bold uppercase tracking-widest text-muted-foreground",
3900
- children: "Active"
3901
- }), /* @__PURE__ */ jsxs("div", {
3902
- className: "mt-2 flex items-baseline gap-2",
3903
- children: [/* @__PURE__ */ jsx("span", {
3904
- className: "font-display text-2xl font-extrabold text-foreground",
3905
- children: activeCount
3906
- }), /* @__PURE__ */ jsxs("span", {
3907
- className: "text-xs text-muted-foreground",
3908
- children: ["of ", scripts.length]
3909
- })]
3910
- })]
3861
+ /* @__PURE__ */ jsx(AlertCircle, { className: "h-5 w-5 shrink-0 text-destructive" }),
3862
+ /* @__PURE__ */ jsx("p", {
3863
+ className: "flex-1 text-sm font-medium text-destructive",
3864
+ children: loadError ?? error
3911
3865
  }),
3912
- /* @__PURE__ */ jsx(InfoPanel, {
3913
- className: "md:col-span-2",
3914
- label: "Execution",
3915
- title: "Scripts run before your agent starts.",
3916
- description: "They execute in order, with full access to injected secrets as environment variables."
3866
+ loadError && /* @__PURE__ */ jsx("button", {
3867
+ type: "button",
3868
+ onClick: () => void loadData(),
3869
+ disabled: loading,
3870
+ className: "inline-flex min-h-11 items-center justify-center rounded-lg border border-border bg-surface-container-high px-4 text-sm font-semibold text-foreground shadow-sm hover:bg-surface-container-highest disabled:opacity-50",
3871
+ children: "Retry"
3917
3872
  })
3918
3873
  ]
3919
3874
  }),
3920
- error && /* @__PURE__ */ jsxs("div", {
3921
- className: "flex items-center gap-3 rounded-lg border border-destructive/30 bg-destructive/10 p-4",
3922
- children: [/* @__PURE__ */ jsx(AlertCircle, { className: "h-5 w-5 shrink-0 text-destructive" }), /* @__PURE__ */ jsx("p", {
3923
- className: "text-sm font-medium text-destructive",
3924
- children: error
3925
- })]
3926
- }),
3927
3875
  /* @__PURE__ */ jsx(Dialog, {
3928
3876
  open: isDialogOpen,
3929
3877
  onOpenChange: setIsDialogOpen,
@@ -4287,7 +4235,7 @@ function StartupScriptsPage({ apiClient, className }) {
4287
4235
  })] })]
4288
4236
  })
4289
4237
  }),
4290
- /* @__PURE__ */ jsxs("div", {
4238
+ (loading || hasLoaded) && /* @__PURE__ */ jsxs("div", {
4291
4239
  className: "overflow-hidden rounded-lg border border-[var(--md3-outline-variant)] bg-surface-container shadow-[var(--shadow-card)]",
4292
4240
  children: [/* @__PURE__ */ jsxs("div", {
4293
4241
  className: "border-b border-[var(--md3-outline-variant)] px-6 py-4 flex items-center justify-between",
@@ -4297,7 +4245,7 @@ function StartupScriptsPage({ apiClient, className }) {
4297
4245
  className: "text-xs font-bold uppercase tracking-widest text-foreground",
4298
4246
  children: "All Scripts"
4299
4247
  })
4300
- }), /* @__PURE__ */ jsxs("span", {
4248
+ }), hasLoaded && /* @__PURE__ */ jsxs("span", {
4301
4249
  className: "text-xs text-muted-foreground font-mono",
4302
4250
  children: [
4303
4251
  scripts.length,
@@ -4305,7 +4253,9 @@ function StartupScriptsPage({ apiClient, className }) {
4305
4253
  scripts.length !== 1 ? "s" : ""
4306
4254
  ]
4307
4255
  })]
4308
- }), loading ? /* @__PURE__ */ jsx("div", {
4256
+ }), loading && !hasLoaded ? /* @__PURE__ */ jsx("div", {
4257
+ role: "status",
4258
+ "aria-label": "Loading startup scripts",
4309
4259
  className: "flex items-center justify-center py-16",
4310
4260
  children: /* @__PURE__ */ jsx("div", {
4311
4261
  className: "h-6 w-6 animate-spin rounded-full border-2 border-primary border-t-transparent",
@@ -4417,40 +4367,6 @@ function StartupScriptsPage({ apiClient, className }) {
4417
4367
  ]
4418
4368
  }, script.id))
4419
4369
  })]
4420
- }),
4421
- /* @__PURE__ */ jsxs("div", {
4422
- className: "grid grid-cols-1 gap-6 md:grid-cols-2",
4423
- children: [/* @__PURE__ */ jsxs("div", {
4424
- className: "rounded-lg border border-[var(--md3-outline-variant)] bg-surface-container p-6 shadow-[var(--shadow-card)]",
4425
- children: [/* @__PURE__ */ jsxs("div", {
4426
- className: "flex items-center gap-3 mb-3",
4427
- children: [/* @__PURE__ */ jsx("div", {
4428
- className: "flex h-9 w-9 items-center justify-center rounded-md bg-[var(--brand-primary,hsl(var(--primary)))] text-[var(--btn-primary-text)]",
4429
- children: /* @__PURE__ */ jsx(Play, { className: "h-5 w-5" })
4430
- }), /* @__PURE__ */ jsx("h3", {
4431
- className: "text-sm font-bold text-foreground",
4432
- children: "How Scripts Run"
4433
- })]
4434
- }), /* @__PURE__ */ jsx("p", {
4435
- className: "text-sm text-muted-foreground",
4436
- children: "Scripts execute in order after the container starts but before the AI agent. They run as bash scripts with full access to mounted tools (Nix profile) and workspace. Failed scripts abort sandbox creation unless \"continue on failure\" is enabled."
4437
- })]
4438
- }), /* @__PURE__ */ jsxs("div", {
4439
- className: "rounded-lg border border-[var(--md3-outline-variant)] bg-surface-container p-6 shadow-[var(--shadow-card)]",
4440
- children: [/* @__PURE__ */ jsxs("div", {
4441
- className: "flex items-center gap-3 mb-3",
4442
- children: [/* @__PURE__ */ jsx("div", {
4443
- className: "flex h-9 w-9 items-center justify-center rounded-md bg-[var(--brand-primary,hsl(var(--primary)))] text-[var(--btn-primary-text)]",
4444
- children: /* @__PURE__ */ jsx(Shield, { className: "h-5 w-5" })
4445
- }), /* @__PURE__ */ jsx("h3", {
4446
- className: "text-sm font-bold text-foreground",
4447
- children: "Security & Secrets"
4448
- })]
4449
- }), /* @__PURE__ */ jsx("p", {
4450
- className: "text-sm text-muted-foreground",
4451
- children: "Selected secrets are injected as environment variables at execution time. Secret values are never stored in the script itself — they are decrypted and injected only when the sandbox starts. Scripts can use conditions to restrict execution to specific environments or resource tiers."
4452
- })]
4453
- })]
4454
4370
  })
4455
4371
  ]
4456
4372
  });
@@ -1,4 +1,4 @@
1
- import { ArtifactPane as ArtifactPane$1, Avatar as Avatar$1, AvatarFallback as AvatarFallback$1, AvatarImage as AvatarImage$1, Badge as Badge$1, Button as Button$1, Card as Card$1, CardContent as CardContent$1, CardDescription as CardDescription$1, CardFooter, CardHeader as CardHeader$1, CardTitle as CardTitle$1, CodeBlock, CopyButton, Dialog as Dialog$1, DialogClose, DialogContent as DialogContent$1, DialogDescription as DialogDescription$1, DialogFooter as DialogFooter$1, DialogHeader as DialogHeader$1, DialogOverlay, DialogPortal, DialogTitle as DialogTitle$1, DialogTrigger, DropZone, DropdownMenu as DropdownMenu$1, DropdownMenuCheckboxItem, DropdownMenuContent as DropdownMenuContent$1, DropdownMenuGroup, DropdownMenuItem as DropdownMenuItem$1, DropdownMenuLabel as DropdownMenuLabel$1, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator as DropdownMenuSeparator$1, DropdownMenuShortcut, DropdownMenuSub as DropdownMenuSub$1, DropdownMenuSubContent as DropdownMenuSubContent$1, DropdownMenuSubTrigger as DropdownMenuSubTrigger$1, DropdownMenuTrigger as DropdownMenuTrigger$1, EmptyState as EmptyState$1, FilterField, Heading, InlineCode, Input as Input$1, Label as Label$1, Metric, MetricStrip, PageHeader, PageHeader as PageHeader$1, PageShell, Progress as Progress$1, SegmentedControl, Select as Select$1, SelectContent as SelectContent$1, SelectGroup, SelectItem as SelectItem$1, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger as SelectTrigger$1, SelectValue as SelectValue$1, SidebarDropZone, Skeleton as Skeleton$1, SkeletonCard as SkeletonCard$1, SkeletonTable, StatCard as StatCard$1, StatusPill, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs as Tabs$1, TabsContent as TabsContent$1, TabsList as TabsList$1, TabsTrigger as TabsTrigger$1, TerminalCursor, TerminalDisplay, TerminalInput, TerminalLine, TextShimmer, Textarea as Textarea$1, ThemeToggle, ToastContainer, ToastProvider, Toolbar, UploadProgress, badgeVariants, buttonVariants, useTheme as useTheme$1, useToast } from "@tangle-network/ui/primitives";
1
+ import { ArtifactPane as ArtifactPane$1, Avatar as Avatar$1, AvatarFallback as AvatarFallback$1, AvatarImage as AvatarImage$1, Badge as Badge$1, Button as Button$1, Card as Card$1, CardContent as CardContent$1, CardDescription as CardDescription$1, CardFooter, CardHeader as CardHeader$1, CardTitle as CardTitle$1, CodeBlock, CopyButton, Dialog as Dialog$1, DialogClose, DialogContent as DialogContent$1, DialogDescription as DialogDescription$1, DialogFooter as DialogFooter$1, DialogHeader as DialogHeader$1, DialogOverlay, DialogPortal, DialogTitle as DialogTitle$1, DialogTrigger, DropZone, DropdownMenu as DropdownMenu$1, DropdownMenuCheckboxItem, DropdownMenuContent as DropdownMenuContent$1, DropdownMenuGroup, DropdownMenuItem as DropdownMenuItem$1, DropdownMenuLabel as DropdownMenuLabel$1, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator as DropdownMenuSeparator$1, DropdownMenuShortcut, DropdownMenuSub as DropdownMenuSub$1, DropdownMenuSubContent as DropdownMenuSubContent$1, DropdownMenuSubTrigger as DropdownMenuSubTrigger$1, DropdownMenuTrigger as DropdownMenuTrigger$1, EmptyState as EmptyState$1, FilterField, Heading, InlineCode, Input as Input$1, Label as Label$1, Metric, MetricStrip, PageHeader, PageHeader as PageHeader$1, PageShell as PageShell$1, Progress as Progress$1, SegmentedControl, Select as Select$1, SelectContent as SelectContent$1, SelectGroup, SelectItem as SelectItem$1, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger as SelectTrigger$1, SelectValue as SelectValue$1, SidebarDropZone, Skeleton as Skeleton$1, SkeletonCard as SkeletonCard$1, SkeletonTable, StatCard as StatCard$1, StatusPill, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs as Tabs$1, TabsContent as TabsContent$1, TabsList as TabsList$1, TabsTrigger as TabsTrigger$1, TerminalCursor, TerminalDisplay, TerminalInput, TerminalLine, TextShimmer, Textarea as Textarea$1, ThemeToggle, ToastContainer, ToastProvider, Toolbar, UploadProgress, badgeVariants, buttonVariants, useTheme as useTheme$1, useToast } from "@tangle-network/ui/primitives";
2
2
  import { Logo, TangleKnot as TangleKnot$1 } from "@tangle-network/brand";
3
3
  import { jsx } from "react/jsx-runtime";
4
4
  //#region src/primitives/logo.tsx
@@ -22,4 +22,4 @@ function SectionTitle(props) {
22
22
  });
23
23
  }
24
24
  //#endregion
25
- export { Select$1 as $, DropdownMenuItem$1 as A, TerminalInput as At, DropdownMenuTrigger$1 as B, buttonVariants as Bt, DialogTitle$1 as C, TableRow as Ct, DropdownMenuCheckboxItem as D, TabsTrigger$1 as Dt, DropdownMenu$1 as E, TabsList$1 as Et, DropdownMenuSeparator$1 as F, ToastContainer as Ft, Input$1 as G, TangleKnot$1 as Gt, FilterField as H, useToast as Ht, DropdownMenuShortcut as I, ToastProvider as It, MetricStrip as J, Label$1 as K, DropdownMenuSub$1 as L, Toolbar as Lt, DropdownMenuPortal as M, TextShimmer as Mt, DropdownMenuRadioGroup as N, Textarea$1 as Nt, DropdownMenuContent$1 as O, TerminalCursor as Ot, DropdownMenuRadioItem as P, ThemeToggle as Pt, SegmentedControl as Q, DropdownMenuSubContent$1 as R, UploadProgress as Rt, DialogPortal as S, TableHeader as St, DropZone as T, TabsContent$1 as Tt, Heading as U, SectionTitle as Ut, EmptyState$1 as V, useTheme$1 as Vt, InlineCode as W, Logo$1 as Wt, PageShell as X, PageHeader$1 as Y, Progress$1 as Z, DialogContent$1 as _, TableBody as _t, Badge$1 as a, SelectScrollUpButton as at, DialogHeader$1 as b, TableFooter as bt, CardContent$1 as c, SelectValue$1 as ct, CardHeader$1 as d, SkeletonCard$1 as dt, SelectContent$1 as et, CardTitle$1 as f, SkeletonTable as ft, DialogClose as g, Table as gt, Dialog$1 as h, Switch as ht, AvatarImage$1 as i, SelectScrollDownButton as it, DropdownMenuLabel$1 as j, TerminalLine as jt, DropdownMenuGroup as k, TerminalDisplay as kt, CardDescription$1 as l, SidebarDropZone as lt, CopyButton as m, StatusPill as mt, Avatar$1 as n, SelectItem$1 as nt, Button$1 as o, SelectSeparator as ot, CodeBlock as p, StatCard$1 as pt, Metric as q, AvatarFallback$1 as r, SelectLabel as rt, Card$1 as s, SelectTrigger$1 as st, ArtifactPane$1 as t, SelectGroup as tt, CardFooter as u, Skeleton$1 as ut, DialogDescription$1 as v, TableCaption as vt, DialogTrigger as w, Tabs$1 as wt, DialogOverlay as x, TableHead as xt, DialogFooter$1 as y, TableCell as yt, DropdownMenuSubTrigger$1 as z, badgeVariants as zt };
25
+ export { Select$1 as $, DropdownMenuItem$1 as A, TerminalInput as At, DropdownMenuTrigger$1 as B, buttonVariants as Bt, DialogTitle$1 as C, TableRow as Ct, DropdownMenuCheckboxItem as D, TabsTrigger$1 as Dt, DropdownMenu$1 as E, TabsList$1 as Et, DropdownMenuSeparator$1 as F, ToastContainer as Ft, Input$1 as G, TangleKnot$1 as Gt, FilterField as H, useToast as Ht, DropdownMenuShortcut as I, ToastProvider as It, MetricStrip as J, Label$1 as K, DropdownMenuSub$1 as L, Toolbar as Lt, DropdownMenuPortal as M, TextShimmer as Mt, DropdownMenuRadioGroup as N, Textarea$1 as Nt, DropdownMenuContent$1 as O, TerminalCursor as Ot, DropdownMenuRadioItem as P, ThemeToggle as Pt, SegmentedControl as Q, DropdownMenuSubContent$1 as R, UploadProgress as Rt, DialogPortal as S, TableHeader as St, DropZone as T, TabsContent$1 as Tt, Heading as U, SectionTitle as Ut, EmptyState$1 as V, useTheme$1 as Vt, InlineCode as W, Logo$1 as Wt, PageShell$1 as X, PageHeader$1 as Y, Progress$1 as Z, DialogContent$1 as _, TableBody as _t, Badge$1 as a, SelectScrollUpButton as at, DialogHeader$1 as b, TableFooter as bt, CardContent$1 as c, SelectValue$1 as ct, CardHeader$1 as d, SkeletonCard$1 as dt, SelectContent$1 as et, CardTitle$1 as f, SkeletonTable as ft, DialogClose as g, Table as gt, Dialog$1 as h, Switch as ht, AvatarImage$1 as i, SelectScrollDownButton as it, DropdownMenuLabel$1 as j, TerminalLine as jt, DropdownMenuGroup as k, TerminalDisplay as kt, CardDescription$1 as l, SidebarDropZone as lt, CopyButton as m, StatusPill as mt, Avatar$1 as n, SelectItem$1 as nt, Button$1 as o, SelectSeparator as ot, CodeBlock as p, StatCard$1 as pt, Metric as q, AvatarFallback$1 as r, SelectLabel as rt, Card$1 as s, SelectTrigger$1 as st, ArtifactPane$1 as t, SelectGroup as tt, CardFooter as u, Skeleton$1 as ut, DialogDescription$1 as v, TableCaption as vt, DialogTrigger as w, Tabs$1 as wt, DialogOverlay as x, TableHead as xt, DialogFooter$1 as y, TableCell as yt, DropdownMenuSubTrigger$1 as z, badgeVariants as zt };
@@ -1,2 +1,2 @@
1
- import { $ as InlineCode, $t as TerminalLine, A as DropZone, At as SkeletonTable, B as DropdownMenuRadioItem, Bt as TableCell, C as DialogDescription, Ct as SelectSeparator, D as DialogPortal, Dt as SidebarDropZoneProps, E as DialogOverlay, Et as SidebarDropZone, F as DropdownMenuGroup, Ft as StatusTone, G as DropdownMenuSubTrigger, Gt as TableRow, H as DropdownMenuShortcut, Ht as TableHead, I as DropdownMenuItem, It as Switch, J as EmptyStateProps, Jt as TabsList, K as DropdownMenuTrigger, Kt as Tabs, L as DropdownMenuLabel, Lt as Table, M as DropdownMenu, Mt as StatCardProps, N as DropdownMenuCheckboxItem, Nt as StatusPill, O as DialogTitle, Ot as Skeleton, P as DropdownMenuContent, Pt as StatusPillProps, Q as HeadingVariant, Qt as TerminalInput, R as DropdownMenuPortal, Rt as TableBody, S as DialogContent, Sn as TangleKnot, St as SelectScrollUpButton, T as DialogHeader, Tt as SelectValue, U as DropdownMenuSub, Ut as TableHeader, V as DropdownMenuSeparator, Vt as TableFooter, W as DropdownMenuSubContent, Wt as TableProps, X as FilterFieldProps, Xt as TerminalCursor, Y as FilterField, Yt as TabsTrigger, Z as Heading, Zt as TerminalDisplay, _ as CodeBlock, _n as HeadingProps, _t as SelectContent, a as AvatarImage, an as Toast, at as MetricProps, b as Dialog, bn as Logo, bt as SelectLabel, c as Button, cn as Toolbar, ct as PageHeader, d as CardContent, dn as UploadProgress, dt as PageShellProps, en as TextShimmer, et as InlineCodeProps, f as CardDescription, fn as UploadProgressProps, ft as Progress, g as CardTitleProps, gn as useToast, gt as Select, h as CardTitle, hn as useTheme, ht as SegmentedControlProps, i as AvatarFallback, in as ThemeToggle, it as Metric, j as DropZoneProps, jt as StatCard, k as DialogTrigger, kt as SkeletonCard, l as ButtonProps, ln as ToolbarProps, lt as PageHeaderProps, m as CardHeader, mn as buttonVariants, mt as SegmentedControlOption, n as ArtifactPaneProps, nn as Textarea, nt as InputProps, o as Badge, on as ToastContainer, ot as MetricStrip, p as CardFooter, pn as badgeVariants, pt as SegmentedControl, q as EmptyState, qt as TabsContent, r as Avatar, rn as TextareaProps, rt as Label, s as BadgeProps, sn as ToastProvider, st as MetricStripProps, t as ArtifactPane, tn as TextShimmerProps, tt as Input, u as Card, un as UploadFile, ut as PageShell, v as CodeBlockProps, vn as SectionTitle, vt as SelectGroup, w as DialogFooter, wt as SelectTrigger, x as DialogClose, xn as LogoProps, xt as SelectScrollDownButton, y as CopyButton, yn as SectionTitleProps, yt as SelectItem, z as DropdownMenuRadioGroup, zt as TableCaption } from "./index-SJKueyy4.js";
1
+ import { $ as InlineCode, $t as TerminalLine, A as DropZone, At as SkeletonTable, B as DropdownMenuRadioItem, Bt as TableCell, C as DialogDescription, Ct as SelectSeparator, D as DialogPortal, Dt as SidebarDropZoneProps, E as DialogOverlay, Et as SidebarDropZone, F as DropdownMenuGroup, Ft as StatusTone, G as DropdownMenuSubTrigger, Gt as TableRow, H as DropdownMenuShortcut, Ht as TableHead, I as DropdownMenuItem, It as Switch, J as EmptyStateProps, Jt as TabsList, K as DropdownMenuTrigger, Kt as Tabs, L as DropdownMenuLabel, Lt as Table, M as DropdownMenu, Mt as StatCardProps, N as DropdownMenuCheckboxItem, Nt as StatusPill, O as DialogTitle, Ot as Skeleton, P as DropdownMenuContent, Pt as StatusPillProps, Q as HeadingVariant, Qt as TerminalInput, R as DropdownMenuPortal, Rt as TableBody, S as DialogContent, Sn as TangleKnot, St as SelectScrollUpButton, T as DialogHeader, Tt as SelectValue, U as DropdownMenuSub, Ut as TableHeader, V as DropdownMenuSeparator, Vt as TableFooter, W as DropdownMenuSubContent, Wt as TableProps, X as FilterFieldProps, Xt as TerminalCursor, Y as FilterField, Yt as TabsTrigger, Z as Heading, Zt as TerminalDisplay, _ as CodeBlock, _n as HeadingProps, _t as SelectContent, a as AvatarImage, an as Toast, at as MetricProps, b as Dialog, bn as Logo, bt as SelectLabel, c as Button, cn as Toolbar, ct as PageHeader, d as CardContent, dn as UploadProgress, dt as PageShellProps, en as TextShimmer, et as InlineCodeProps, f as CardDescription, fn as UploadProgressProps, ft as Progress, g as CardTitleProps, gn as useToast, gt as Select, h as CardTitle, hn as useTheme, ht as SegmentedControlProps, i as AvatarFallback, in as ThemeToggle, it as Metric, j as DropZoneProps, jt as StatCard, k as DialogTrigger, kt as SkeletonCard, l as ButtonProps, ln as ToolbarProps, lt as PageHeaderProps, m as CardHeader, mn as buttonVariants, mt as SegmentedControlOption, n as ArtifactPaneProps, nn as Textarea, nt as InputProps, o as Badge, on as ToastContainer, ot as MetricStrip, p as CardFooter, pn as badgeVariants, pt as SegmentedControl, q as EmptyState, qt as TabsContent, r as Avatar, rn as TextareaProps, rt as Label, s as BadgeProps, sn as ToastProvider, st as MetricStripProps, t as ArtifactPane, tn as TextShimmerProps, tt as Input, u as Card, un as UploadFile, ut as PageShell, v as CodeBlockProps, vn as SectionTitle, vt as SelectGroup, w as DialogFooter, wt as SelectTrigger, x as DialogClose, xn as LogoProps, xt as SelectScrollDownButton, y as CopyButton, yn as SectionTitleProps, yt as SelectItem, z as DropdownMenuRadioGroup, zt as TableCaption } from "./index-wLVwzOsB.js";
2
2
  export { ArtifactPane, type ArtifactPaneProps, Avatar, AvatarFallback, AvatarImage, Badge, type BadgeProps, Button, type ButtonProps, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, type CardTitleProps, CodeBlock, type CodeBlockProps, CopyButton, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DropZone, type DropZoneProps, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmptyState, type EmptyStateProps, FilterField, type FilterFieldProps, Heading, type HeadingProps, type HeadingVariant, InlineCode, type InlineCodeProps, Input, type InputProps, Label, Logo, type LogoProps, Metric, type MetricProps, MetricStrip, type MetricStripProps, PageHeader, type PageHeaderProps, PageShell, type PageShellProps, Progress, SectionTitle, type SectionTitleProps, SegmentedControl, type SegmentedControlOption, type SegmentedControlProps, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, SidebarDropZone, type SidebarDropZoneProps, Skeleton, SkeletonCard, SkeletonTable, StatCard, type StatCardProps, StatusPill, type StatusPillProps, type StatusTone, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, type TableProps, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, TangleKnot, TerminalCursor, TerminalDisplay, TerminalInput, TerminalLine, TextShimmer, type TextShimmerProps, Textarea, type TextareaProps, ThemeToggle, type Toast, ToastContainer, ToastProvider, Toolbar, type ToolbarProps, type UploadFile, UploadProgress, type UploadProgressProps, badgeVariants, buttonVariants, useTheme, useToast };
@@ -1,2 +1,2 @@
1
- import { $ as Select, A as DropdownMenuItem, At as TerminalInput, B as DropdownMenuTrigger, Bt as buttonVariants, C as DialogTitle, Ct as TableRow, D as DropdownMenuCheckboxItem, Dt as TabsTrigger, E as DropdownMenu, Et as TabsList, F as DropdownMenuSeparator, Ft as ToastContainer, G as Input, Gt as TangleKnot, H as FilterField, Ht as useToast, I as DropdownMenuShortcut, It as ToastProvider, J as MetricStrip, K as Label, L as DropdownMenuSub, Lt as Toolbar, M as DropdownMenuPortal, Mt as TextShimmer, N as DropdownMenuRadioGroup, Nt as Textarea, O as DropdownMenuContent, Ot as TerminalCursor, P as DropdownMenuRadioItem, Pt as ThemeToggle, Q as SegmentedControl, R as DropdownMenuSubContent, Rt as UploadProgress, S as DialogPortal, St as TableHeader, T as DropZone, Tt as TabsContent, U as Heading, Ut as SectionTitle, V as EmptyState, Vt as useTheme, W as InlineCode, Wt as Logo, X as PageShell, Y as PageHeader, Z as Progress, _ as DialogContent, _t as TableBody, a as Badge, at as SelectScrollUpButton, b as DialogHeader, bt as TableFooter, c as CardContent, ct as SelectValue, d as CardHeader, dt as SkeletonCard, et as SelectContent, f as CardTitle, ft as SkeletonTable, g as DialogClose, gt as Table, h as Dialog, ht as Switch, i as AvatarImage, it as SelectScrollDownButton, j as DropdownMenuLabel, jt as TerminalLine, k as DropdownMenuGroup, kt as TerminalDisplay, l as CardDescription, lt as SidebarDropZone, m as CopyButton, mt as StatusPill, n as Avatar, nt as SelectItem, o as Button, ot as SelectSeparator, p as CodeBlock, pt as StatCard, q as Metric, r as AvatarFallback, rt as SelectLabel, s as Card, st as SelectTrigger, t as ArtifactPane, tt as SelectGroup, u as CardFooter, ut as Skeleton, v as DialogDescription, vt as TableCaption, w as DialogTrigger, wt as Tabs, x as DialogOverlay, xt as TableHead, y as DialogFooter, yt as TableCell, z as DropdownMenuSubTrigger, zt as badgeVariants } from "./primitives-BQGtwZX3.js";
1
+ import { $ as Select, A as DropdownMenuItem, At as TerminalInput, B as DropdownMenuTrigger, Bt as buttonVariants, C as DialogTitle, Ct as TableRow, D as DropdownMenuCheckboxItem, Dt as TabsTrigger, E as DropdownMenu, Et as TabsList, F as DropdownMenuSeparator, Ft as ToastContainer, G as Input, Gt as TangleKnot, H as FilterField, Ht as useToast, I as DropdownMenuShortcut, It as ToastProvider, J as MetricStrip, K as Label, L as DropdownMenuSub, Lt as Toolbar, M as DropdownMenuPortal, Mt as TextShimmer, N as DropdownMenuRadioGroup, Nt as Textarea, O as DropdownMenuContent, Ot as TerminalCursor, P as DropdownMenuRadioItem, Pt as ThemeToggle, Q as SegmentedControl, R as DropdownMenuSubContent, Rt as UploadProgress, S as DialogPortal, St as TableHeader, T as DropZone, Tt as TabsContent, U as Heading, Ut as SectionTitle, V as EmptyState, Vt as useTheme, W as InlineCode, Wt as Logo, X as PageShell, Y as PageHeader, Z as Progress, _ as DialogContent, _t as TableBody, a as Badge, at as SelectScrollUpButton, b as DialogHeader, bt as TableFooter, c as CardContent, ct as SelectValue, d as CardHeader, dt as SkeletonCard, et as SelectContent, f as CardTitle, ft as SkeletonTable, g as DialogClose, gt as Table, h as Dialog, ht as Switch, i as AvatarImage, it as SelectScrollDownButton, j as DropdownMenuLabel, jt as TerminalLine, k as DropdownMenuGroup, kt as TerminalDisplay, l as CardDescription, lt as SidebarDropZone, m as CopyButton, mt as StatusPill, n as Avatar, nt as SelectItem, o as Button, ot as SelectSeparator, p as CodeBlock, pt as StatCard, q as Metric, r as AvatarFallback, rt as SelectLabel, s as Card, st as SelectTrigger, t as ArtifactPane, tt as SelectGroup, u as CardFooter, ut as Skeleton, v as DialogDescription, vt as TableCaption, w as DialogTrigger, wt as Tabs, x as DialogOverlay, xt as TableHead, y as DialogFooter, yt as TableCell, z as DropdownMenuSubTrigger, zt as badgeVariants } from "./primitives-C4qn9fZ8.js";
2
2
  export { ArtifactPane, Avatar, AvatarFallback, AvatarImage, Badge, Button, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, CodeBlock, CopyButton, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DropZone, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmptyState, FilterField, Heading, InlineCode, Input, Label, Logo, Metric, MetricStrip, PageHeader, PageShell, Progress, SectionTitle, SegmentedControl, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, SidebarDropZone, Skeleton, SkeletonCard, SkeletonTable, StatCard, StatusPill, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, TangleKnot, TerminalCursor, TerminalDisplay, TerminalInput, TerminalLine, TextShimmer, Textarea, ThemeToggle, ToastContainer, ToastProvider, Toolbar, UploadProgress, badgeVariants, buttonVariants, useTheme, useToast };