Add project CRUD API (GET/POST/PATCH/DELETE) with ownership checks and transactional delete. Add diagram list filtering by projectId and unorganized query params with typed Zod query schema for Hono RPC type safety. Create DiagramSidebar with Projects tree (expand/collapse, inline rename) and Recent tab. Add project picker to CreateDiagramDialog. Includes 15 schema validation tests (107 total passing). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
407 lines
8.1 KiB
TypeScript
407 lines
8.1 KiB
TypeScript
import {
|
|
Activity,
|
|
AlertCircle,
|
|
AlertTriangle,
|
|
ArrowRight,
|
|
AtSign,
|
|
LogIn,
|
|
UserRound,
|
|
SunMoon,
|
|
Moon,
|
|
Sun,
|
|
Undo2,
|
|
Check,
|
|
Loader,
|
|
Loader2,
|
|
CircleX,
|
|
CheckCircle2,
|
|
Gift,
|
|
X,
|
|
CheckIcon,
|
|
ArrowUp,
|
|
Globe2,
|
|
GraduationCap,
|
|
Atom,
|
|
Brain,
|
|
LogOut,
|
|
Settings,
|
|
Home,
|
|
Star,
|
|
CreditCard,
|
|
EllipsisVertical,
|
|
User2,
|
|
LifeBuoy,
|
|
MessageCircle,
|
|
MessageSquare,
|
|
MessageSquarePlus,
|
|
Plus,
|
|
Trash,
|
|
Ellipsis,
|
|
ClockFading,
|
|
BadgeCheck,
|
|
BadgeX,
|
|
ArrowUpRight,
|
|
Menu,
|
|
MonitorSmartphone,
|
|
Key,
|
|
TrendingUp,
|
|
TrendingDown,
|
|
PaintBucket,
|
|
ChartNoAxesGantt,
|
|
BookOpen,
|
|
Webhook,
|
|
Download,
|
|
ChevronRight,
|
|
SendHorizontal,
|
|
Copy,
|
|
ChevronsUpDown,
|
|
ArrowDown,
|
|
ArrowLeft,
|
|
UserRoundPlus,
|
|
UsersRound,
|
|
Search,
|
|
Filter,
|
|
ChevronsLeft,
|
|
ChevronLeft,
|
|
ChevronsRight,
|
|
Settings2,
|
|
ChevronDown,
|
|
EyeOff,
|
|
ChevronUp,
|
|
XCircle,
|
|
MailPlus,
|
|
PlusCircle,
|
|
Calendar,
|
|
ShieldUser,
|
|
Building,
|
|
HandCoins,
|
|
Code,
|
|
VenetianMask,
|
|
Ban,
|
|
Eye,
|
|
Lock,
|
|
Slash,
|
|
MoreHorizontal,
|
|
MoreVertical,
|
|
Circle,
|
|
Minus,
|
|
PanelLeft,
|
|
Database,
|
|
Snowflake,
|
|
Cloud,
|
|
Crown,
|
|
Target,
|
|
Megaphone,
|
|
Package,
|
|
Headphones,
|
|
Info,
|
|
Bell,
|
|
Share2,
|
|
LayoutDashboard,
|
|
Pencil,
|
|
BarChart3,
|
|
// AI module icons
|
|
ImagePlus,
|
|
Image,
|
|
Globe,
|
|
Sparkle,
|
|
Sparkles,
|
|
Square,
|
|
SquarePen,
|
|
TextSearch,
|
|
MessagesSquare,
|
|
ExternalLink,
|
|
FileText,
|
|
ChartNoAxesColumn,
|
|
Zap,
|
|
PackageOpen,
|
|
Paperclip,
|
|
AudioLines,
|
|
AudioWaveform,
|
|
Undo,
|
|
Pause,
|
|
Play,
|
|
Redo,
|
|
BanknoteX,
|
|
ClockAlert,
|
|
RotateCcw,
|
|
RotateCw,
|
|
ThumbsUp,
|
|
ThumbsDown,
|
|
// Additional AI module icons
|
|
Shrub,
|
|
Lightbulb,
|
|
Puzzle,
|
|
Smile,
|
|
RefreshCcw,
|
|
LibraryBig,
|
|
BadgeDollarSign,
|
|
Newspaper,
|
|
RectangleHorizontal,
|
|
RectangleVertical,
|
|
ImagePlay,
|
|
ImageOff,
|
|
Send,
|
|
FileUp,
|
|
FileX,
|
|
DownloadCloud,
|
|
Link,
|
|
ScrollText,
|
|
Mic,
|
|
MicOff,
|
|
Workflow,
|
|
Server,
|
|
ArrowRightLeft,
|
|
GitBranch,
|
|
FolderOpen,
|
|
Inbox,
|
|
Trash2,
|
|
} from "lucide-react";
|
|
|
|
import { Icons as GlobalIcons } from "@turbostarter/ui/assets";
|
|
|
|
import type { FC, SVGProps } from "react";
|
|
|
|
|
|
// AI Provider Icons
|
|
const createProviderIcon = (paths: string[], viewBox = "0 0 24 24"): FC<SVGProps<SVGSVGElement>> => {
|
|
const Component: FC<SVGProps<SVGSVGElement>> = (props) => (
|
|
<svg
|
|
xmlns="http://www.w3.org/2000/svg"
|
|
viewBox={viewBox}
|
|
fill="currentColor"
|
|
{...props}
|
|
>
|
|
{paths.map((d, i) => (
|
|
<path key={i} d={d} />
|
|
))}
|
|
</svg>
|
|
);
|
|
return Component;
|
|
};
|
|
|
|
const OpenAI = createProviderIcon([
|
|
"M22.282 9.821a5.985 5.985 0 0 0-.516-4.91 6.046 6.046 0 0 0-6.51-2.9A6.065 6.065 0 0 0 4.981 4.18a5.985 5.985 0 0 0-3.998 2.9 6.046 6.046 0 0 0 .743 7.097 5.98 5.98 0 0 0 .51 4.911 6.051 6.051 0 0 0 6.515 2.9A5.985 5.985 0 0 0 13.26 24a6.056 6.056 0 0 0 5.772-4.206 5.99 5.99 0 0 0 3.997-2.9 6.056 6.056 0 0 0-.747-7.073zM13.26 22.43a4.476 4.476 0 0 1-2.876-1.04l.141-.081 4.779-2.758a.795.795 0 0 0 .392-.681v-6.737l2.02 1.168a.071.071 0 0 1 .038.052v5.583a4.504 4.504 0 0 1-4.494 4.494zM3.6 18.304a4.47 4.47 0 0 1-.535-3.014l.142.085 4.783 2.759a.771.771 0 0 0 .78 0l5.843-3.369v2.332a.08.08 0 0 1-.033.062L9.74 19.95a4.5 4.5 0 0 1-6.14-1.646zM2.34 7.896a4.485 4.485 0 0 1 2.366-1.973V11.6a.766.766 0 0 0 .388.677l5.815 3.355-2.02 1.168a.076.076 0 0 1-.071 0l-4.83-2.786A4.504 4.504 0 0 1 2.34 7.896zm16.597 3.855l-5.833-3.387L15.119 7.2a.076.076 0 0 1 .071 0l4.83 2.791a4.494 4.494 0 0 1-.676 8.105v-5.678a.79.79 0 0 0-.407-.667zm2.01-3.023l-.141-.085-4.774-2.782a.776.776 0 0 0-.785 0L9.409 9.23V6.897a.066.066 0 0 1 .028-.061l4.83-2.787a4.5 4.5 0 0 1 6.68 4.66zm-12.64 4.135l-2.02-1.164a.08.08 0 0 1-.038-.057V6.075a4.5 4.5 0 0 1 7.375-3.453l-.142.08L8.704 5.46a.795.795 0 0 0-.393.681zm1.097-2.365l2.602-1.5 2.607 1.5v2.999l-2.597 1.5-2.607-1.5z",
|
|
]);
|
|
|
|
const Gemini = createProviderIcon([
|
|
"M12 0C5.372 0 0 5.373 0 12s5.372 12 12 12 12-5.373 12-12S18.628 0 12 0zm5.568 14.163c-.169.288-.456.457-.781.457H7.213c-.325 0-.612-.169-.781-.457L4.194 12l2.238-2.163c.169-.288.456-.456.781-.456h9.574c.325 0 .612.168.781.456L19.806 12l-2.238 2.163z",
|
|
]);
|
|
|
|
const Claude = createProviderIcon([
|
|
"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 15.5v-4.38l-3.5 2.19-.75-1.23L10.5 12l-3.75-2.08.75-1.23L11 10.88V6.5h1.5v4.38l3.5-2.19.75 1.23L13 12l3.75 2.08-.75 1.23-3.5-2.19V17.5H11z",
|
|
]);
|
|
|
|
const Grok = createProviderIcon([
|
|
"M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z",
|
|
]);
|
|
|
|
const DeepSeek = createProviderIcon([
|
|
"M12 2a10 10 0 1 0 10 10A10 10 0 0 0 12 2zm0 18a8 8 0 1 1 8-8 8 8 0 0 1-8 8zm4-9h-3V8a1 1 0 0 0-2 0v3H8a1 1 0 0 0 0 2h3v3a1 1 0 0 0 2 0v-3h3a1 1 0 0 0 0-2z",
|
|
]);
|
|
|
|
const Replicate = createProviderIcon([
|
|
"M4.5 2.5a2 2 0 0 0-2 2v15a2 2 0 0 0 2 2h15a2 2 0 0 0 2-2v-15a2 2 0 0 0-2-2h-15zm2 5h11v2h-11v-2zm0 4h11v2h-11v-2zm0 4h7v2h-7v-2z",
|
|
]);
|
|
|
|
const Luma = createProviderIcon([
|
|
"M12 2L2 7l10 5 10-5-10-5zM2 17l10 5 10-5M2 12l10 5 10-5",
|
|
]);
|
|
|
|
const StabilityAI = createProviderIcon([
|
|
"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm-5-9h10v2H7z",
|
|
]);
|
|
|
|
const Recraft = createProviderIcon([
|
|
"M20.71 7.04c.39-.39.39-1.02 0-1.41l-2.34-2.34a.996.996 0 0 0-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83zM3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM5.92 19H5v-.92l9.06-9.06.92.92L5.92 19z",
|
|
]);
|
|
|
|
const ElevenLabs = createProviderIcon([
|
|
"M9 2v20M15 2v20",
|
|
]);
|
|
|
|
const Nvidia = createProviderIcon([
|
|
"M11.06 8.84c-.6-.3-1.33-.4-2.06-.4-1.91 0-3.47.8-4.3 2.23l-.72-.42c.95-1.66 2.83-2.64 5.02-2.64.87 0 1.72.13 2.46.5l-.4.73zm7.56-3.12c-1.5-1.17-3.57-1.72-5.76-1.72-2.95 0-5.5 1.01-7.05 2.72-.98 1.08-1.59 2.4-1.81 3.87l.82.15c.2-1.32.73-2.5 1.59-3.45 1.4-1.55 3.7-2.45 6.45-2.45 2.02 0 3.9.51 5.24 1.54l.52-.66zM12 22c5.52 0 10-4.48 10-10S17.52 2 12 2 2 6.48 2 12s4.48 10 10 10z",
|
|
]);
|
|
|
|
export const Icons = {
|
|
...GlobalIcons,
|
|
Minus,
|
|
PanelLeft,
|
|
Eye,
|
|
Slash,
|
|
Code,
|
|
VenetianMask,
|
|
Lock,
|
|
MailPlus,
|
|
ClockFading,
|
|
Calendar,
|
|
ArrowRight,
|
|
LogIn,
|
|
UserRound,
|
|
Key,
|
|
SunMoon,
|
|
ChevronRight,
|
|
Moon,
|
|
Sun,
|
|
Undo2,
|
|
Check,
|
|
Loader2,
|
|
CircleX,
|
|
Ban,
|
|
CheckCircle2,
|
|
CheckIcon,
|
|
Gift,
|
|
X,
|
|
ArrowUp,
|
|
Globe2,
|
|
GraduationCap,
|
|
ChartNoAxesGantt,
|
|
BookOpen,
|
|
Webhook,
|
|
Star,
|
|
Atom,
|
|
Brain,
|
|
LogOut,
|
|
Settings,
|
|
Home,
|
|
CreditCard,
|
|
User2,
|
|
EllipsisVertical,
|
|
LifeBuoy,
|
|
MessageCircle,
|
|
Plus,
|
|
Loader,
|
|
Ellipsis,
|
|
Trash,
|
|
BadgeCheck,
|
|
BadgeX,
|
|
ArrowUpRight,
|
|
Menu,
|
|
MonitorSmartphone,
|
|
Download,
|
|
Copy,
|
|
PaintBucket,
|
|
SendHorizontal,
|
|
ChevronsUpDown,
|
|
ArrowDown,
|
|
ArrowLeft,
|
|
UsersRound,
|
|
UserRoundPlus,
|
|
Search,
|
|
Filter,
|
|
ChevronsLeft,
|
|
ChevronLeft,
|
|
ChevronsRight,
|
|
Settings2,
|
|
ChevronDown,
|
|
EyeOff,
|
|
ChevronUp,
|
|
XCircle,
|
|
PlusCircle,
|
|
ShieldUser,
|
|
Building,
|
|
HandCoins,
|
|
TrendingUp,
|
|
MoreHorizontal,
|
|
MoreVertical,
|
|
Circle,
|
|
BarChart3,
|
|
BarChart: BarChart3,
|
|
Pencil,
|
|
Clock: ClockFading,
|
|
Database,
|
|
Snowflake,
|
|
Cloud,
|
|
Crown,
|
|
Target,
|
|
Megaphone,
|
|
Package,
|
|
Headphones,
|
|
TrendingDown,
|
|
AlertTriangle,
|
|
AlertCircle,
|
|
Info,
|
|
Bell,
|
|
Share: Share2,
|
|
Activity,
|
|
AtSign,
|
|
MessageSquare,
|
|
MessageSquarePlus,
|
|
LayoutDashboard,
|
|
Edit: Pencil,
|
|
// AI module icons
|
|
ImagePlus,
|
|
Globe,
|
|
Sparkle,
|
|
Sparkles,
|
|
Square,
|
|
SquarePen,
|
|
TextSearch,
|
|
MessagesSquare,
|
|
ExternalLink,
|
|
FileText,
|
|
ChartNoAxesColumn,
|
|
Zap,
|
|
PackageOpen,
|
|
Paperclip,
|
|
AudioLines,
|
|
AudioWaveform,
|
|
Undo,
|
|
Pause,
|
|
Play,
|
|
Redo,
|
|
BanknoteX,
|
|
ClockAlert,
|
|
RotateCcw,
|
|
RotateCw,
|
|
Image,
|
|
ThumbsUp,
|
|
ThumbsDown,
|
|
// Additional AI module icons
|
|
Shrub,
|
|
Lightbulb,
|
|
Puzzle,
|
|
Smile,
|
|
RefreshCcw,
|
|
LibraryBig,
|
|
BadgeDollarSign,
|
|
Newspaper,
|
|
RectangleHorizontal,
|
|
RectangleVertical,
|
|
ImagePlay,
|
|
ImageOff,
|
|
Send,
|
|
FileUp,
|
|
FileUpIcon: FileUp,
|
|
FileX,
|
|
DownloadCloud,
|
|
Link,
|
|
ScrollText,
|
|
Mic,
|
|
MicOff,
|
|
Workflow,
|
|
Server,
|
|
ArrowRightLeft,
|
|
GitBranch,
|
|
FolderOpen,
|
|
Inbox,
|
|
Trash2,
|
|
MinusIcon: Minus,
|
|
PlusIcon: Plus,
|
|
// AI provider icons
|
|
OpenAI,
|
|
Gemini,
|
|
Claude,
|
|
Grok,
|
|
DeepSeek,
|
|
Replicate,
|
|
Luma,
|
|
StabilityAI,
|
|
Recraft,
|
|
ElevenLabs,
|
|
Nvidia,
|
|
};
|
|
|
|
export type Icon = (typeof Icons)[keyof typeof Icons];
|