44406b72db
Moteva-style AI design workbench replica. Home prompt creates a project; the project page provides an infinite canvas with node drag, zoom/pan, a design chat panel, history replay, image asset upload, and project save/regenerate. - Backend: go-zero, DDD layering, sqlc/pgx, optional PostgreSQL; memory or Redis cache; asynq job queue; MinIO/S3/R2/OSS object storage; sky-valley/pi agent runtime adapter. - Frontend: Next.js App Router + Vite artifact build, TypeScript, i18n, shadcn/ui components, auth (OTP/Turnstile/Google/WeChat). - Deploy: Docker Compose and k3s manifests. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
19 lines
819 B
TypeScript
19 lines
819 B
TypeScript
"use client";
|
|
|
|
import * as TabsPrimitive from "@radix-ui/react-tabs";
|
|
import type { ComponentProps } from "react";
|
|
|
|
export const Tabs = TabsPrimitive.Root;
|
|
|
|
export function TabsList({ className = "", ...props }: ComponentProps<typeof TabsPrimitive.List>) {
|
|
return <TabsPrimitive.List className={["ui-tabs-list", className].filter(Boolean).join(" ")} {...props} />;
|
|
}
|
|
|
|
export function TabsTrigger({ className = "", ...props }: ComponentProps<typeof TabsPrimitive.Trigger>) {
|
|
return <TabsPrimitive.Trigger className={["ui-tabs-trigger", className].filter(Boolean).join(" ")} {...props} />;
|
|
}
|
|
|
|
export function TabsContent({ className = "", ...props }: ComponentProps<typeof TabsPrimitive.Content>) {
|
|
return <TabsPrimitive.Content className={["ui-tabs-content", className].filter(Boolean).join(" ")} {...props} />;
|
|
}
|