feat: docs and ui tweaks

This commit is contained in:
DESKTOP-RTLN3BA\$punk 2026-07-06 19:26:35 -07:00
parent 64f2b4a6eb
commit 271a21aee6
103 changed files with 2161 additions and 2625 deletions

View file

@ -14,6 +14,7 @@ import {
modelRolesAtom,
} from "@/atoms/model-connections/model-connections-query.atoms";
import { activeWorkspaceIdAtom } from "@/atoms/workspaces/workspace-query.atoms";
import { ConnectorIndicator } from "@/components/assistant-ui/connector-popup";
import { DocumentUploadDialogProvider } from "@/components/assistant-ui/document-upload-popup";
import { LayoutDataProvider } from "@/components/layout";
import { OnboardingTour } from "@/components/onboarding-tour";
@ -214,7 +215,10 @@ export function DashboardClientLayout({
return (
<DocumentUploadDialogProvider>
<OnboardingTour />
<LayoutDataProvider workspaceId={workspaceId}>{children}</LayoutDataProvider>
<LayoutDataProvider workspaceId={workspaceId}>
{children}
<ConnectorIndicator showTrigger={false} />
</LayoutDataProvider>
</DocumentUploadDialogProvider>
);
}

View file

@ -2,11 +2,22 @@
import { ArrowRight, History, KeyRound } from "lucide-react";
import Link from "next/link";
import { useMemo } from "react";
import { useScraperCapabilities } from "@/hooks/use-scraper-capabilities";
import { PLAYGROUND_PLATFORMS } from "@/lib/playground/catalog";
import { formatPricing } from "@/lib/playground/format";
export function PlaygroundIndex({ workspaceId }: { workspaceId: number }) {
const base = `/dashboard/${workspaceId}/playground`;
// The grid renders from the static catalog immediately; pricing fills in
// once the capabilities fetch lands (blank while loading, never blocking).
const { data: capabilities } = useScraperCapabilities(workspaceId);
const pricingByName = useMemo(
() => new Map(capabilities?.map((c) => [c.name, formatPricing(c.pricing)])),
[capabilities]
);
return (
<div className="space-y-8">
<div>
@ -67,6 +78,11 @@ export function PlaygroundIndex({ workspaceId }: { workspaceId: number }) {
<ArrowRight className="h-4 w-4 text-muted-foreground opacity-0 transition-opacity group-hover:opacity-100" />
</div>
<code className="mt-2 text-xs text-muted-foreground">{verb.name}</code>
{pricingByName.has(verb.name) ? (
<span className="mt-2 text-xs tabular-nums text-muted-foreground">
{pricingByName.get(verb.name)}
</span>
) : null}
</Link>
))}
</div>

View file

@ -10,7 +10,7 @@ import { useScraperCapabilities } from "@/hooks/use-scraper-capabilities";
import { scrapersApiService } from "@/lib/apis/scrapers-api.service";
import { AbortedError, AppError } from "@/lib/error";
import { findVerb } from "@/lib/playground/catalog";
import { formatCost, formatDuration } from "@/lib/playground/format";
import { formatCost, formatDuration, formatPricing } from "@/lib/playground/format";
import { buildPayload, initialFormValues, parseSchemaFields } from "@/lib/playground/json-schema";
import { ApiReference } from "./api-reference";
import { OutputViewer } from "./output-viewer";
@ -198,6 +198,12 @@ export function PlaygroundRunner({ workspaceId, platform, verb }: PlaygroundRunn
<code className="mt-2 inline-block rounded bg-muted/40 px-1.5 py-0.5 text-xs text-muted-foreground">
POST /workspaces/{workspaceId}/scrapers/{platform}/{verb}
</code>
<div className="mt-2 flex items-center gap-1.5 text-xs text-muted-foreground">
<Coins className="h-3.5 w-3.5" />
<span className="font-medium tabular-nums text-foreground">
{formatPricing(capability.pricing)}
</span>
</div>
</div>
<SchemaForm